Internet DRAFT - draft-jdobias-appsawg-swapi
draft-jdobias-appsawg-swapi
INTERNET-DRAFT draft-jdobias-appsawg-swapi-00.txt
Intended Status: Standards Track J. A. Dobias
Category: Informational AsiaComtek
Expires: April 2, 2014 September 2013
Simple Web Application Programming Interface -- SWAPI 2.1
Status of this Memo
This Internet-Draft is submitted in full conformance with the
provisions of BCP 78 and BCP 79. Internet-Drafts are working
documents of the Internet Engineering Task Force (IETF). Note that
other groups may also distribute working documents as
Internet-Drafts. The list of current Internet-Drafts is at
http://datatracker.ietf.org/drafts/current.
Internet-Drafts are draft documents valid for a maximum of six months
and may be updated, replaced, or obsoleted by other documents at any
time. It is inappropriate to use Internet-Drafts as reference
material or to cite them other than as "work in progress."
Copyright Notice
Copyright (c) 2013 IETF Trust and the persons identified as the
document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal
Provisions Relating to IETF Documents
(http://trustee.ietf.org/license-info) in effect on the date of
publication of this document. Please review these documents
carefully, as they describe your rights and restrictions with respect
to this document.
This document may not be modified, and derivative works of it may not
be created, except to format it for publication as an RFC or to
translate it into languages other than English.
Abstract
SWAPI is a non application specific protocol which operates on top of
the standard HTTP or HTTPS application-level protocol. It is
specifically designed to expose web services as a lightweight non
language specific interface that is extremely easy to parse without
the need of any external software libraries.
The structure of the protocol is simple enough to allow client
applications to make and receive SWAPI calls via most shell scripts.
However, the structure also provides strict type casting hints on
responses which make the protocol suitable for integration with
software written in high and low level programming languages.
Dobias Informational [Page 1]
Internet-Draft SWAPI 2.1 September 2013
SWAPI is especially well suited to heterogeneous environments where
connectivity to a web service from many different types of client may
be required. As a design goal, the parsing of responses is
completely linear and can be done with the standard string processing
functions built into any programming language and most shell
scripting emvironments.
Table of Contents
1 Introduction ............................................... pg 3
1.1 Purpose ................................................ pg 4
1.2 Current Usage Examples ................................. pg 4
1.3 Terminology ............................................ pg 4
2 Justification .............................................. pg 5
3 Data Integrity ............................................. pg 6
3.1 Compatibility .......................................... pg 7
3.2 Signing Mode Keys ...................................... pg 7
3.3 Client Identification .................................. pg 7
4 Making API Calls ........................................... pg 8
4.1 Calling the URL ........................................ pg 8
4.2 Passing Arguments ...................................... pg 9
4.3 Sending Arrays ......................................... pg 9
4.4 Client Identification .................................. pg 10
4.5 Signing Mode API Calls ................................. pg 10
4.5.1 The Signing Key .................................... pg 10
4.5.2 Signing the API Call ............................... pg 10
4.5.3 Requesting the Response Type ....................... pg 11
4.6 Timeouts ............................................... pg 12
5 Using Return Values ........................................ pg 12
5.1 Null ................................................... pg 13
5.2 Strings ................................................ pg 13
5.2.1 Strings with new lines ............................. pg 13
5.3 Integers ............................................... pg 13
5.4 Floating Points ........................................ pg 13
5.5 Booleans ............................................... pg 14
5.6 Arrays ................................................. pg 14
5.6.1 Associative Arrays ................................. pg 15
5.7 Comments ............................................... pg 15
5.8 Errors ................................................. pg 16
5.8.1 Signing Mode Errors ................................ pg 16
5.9 Signing Mode Responses ................................. pg 17
5.9.1 Verifying a Signature .............................. pg 17
6 Creating a SWAPI Compliant Function ........................ pg 18
6.1 The SWAPI Function Files ............................... pg 18
6.2 HTTP Headers ........................................... pg 18
6.3 New Lines .............................................. pg 18
6.4 Avoiding Timeouts on Complex Functions ................. pg 19
6.5 Returning Null ......................................... pg 19
6.6 Returning Strings ...................................... pg 19
6.7 Returning Integers ..................................... pg 19
6.8 Returning Floating Points .............................. pg 20
Dobias Informational [Page 2]
Internet-Draft SWAPI 2.1 September 2013
6.9 Returning Booleans ..................................... pg 20
6.10 Returning Arrays ...................................... pg 21
6.10.1 Associative Arrays ................................ pg 22
6.11 Showing Comments ...................................... pg 23
6.12 Receiving Arguments ................................... pg 24
6.13 Identifying the Client ................................ pg 24
6.14 Receiving Signing Mode Requests ....................... pg 25
6.15 Receiving Signed API Calls ............................ pg 25
6.15.1 Verifying a Signature ............................. pg 25
6.16 Responding in Signing Mode ............................ pg 26
6.16.1 Signing a Response ................................ pg 27
6.17 Implementing a Verbose Mode ........................... pg 28
6.18 Returning an Error .................................... pg 28
7 Security Considerations .................................... pg 28
8 IANA Considerations ........................................ pg 28
Appendix A) Allowable character sets ......................... pg 29
1 Introduction
This document is the first submission of the SWAPI protocol for
consideration as an internet standard. The protocol has matured over
the past 10 years since initial development to a level that may be
appropriate for acceptance within a relevent working group of the
IETF and eventually published as an RFC. Version 2.1 is the first
version submitted as an Internet Draft.
The web API specification in this document is designed to facilitate
a closed proprietary API call system for systems that do not require
description, discovery or complex data types. The methodology for
making API calls allows them to behave similar to standard
programming language functions in that they return a value when
called and may also receive arguments. SWAPI is designed as a simple
alternative to other web service technologies such as XML/RPC or
SOAP. Those protocols are designed for public web services and have
a significant amount of memory and processor overhead involved in
their processing. The aim of SWAPI is to provide a much lighter and
simple interface with greater compatibility. The trade off is that
there is no out-of-the-box solution for processing SWAPI calls like
in the SOAP model and no automatic discovery and description (hence
it is aimed at creating closed proprietary APIs). Therefore, the use
of SWAPI requires the service provider to make a function reference
guide available to service users. There is also no support for
complex data types such as objects or structures. But it does
support mixed type arrays and multidimensional arrays and associative
arrays. SWAPI 2.1 also adds the null data type.
The data signing feature new to SWAPI 2.0 is also very efficient.
Developers can choose to implement data signing on API calls or
server responses. Signing is also linked to another new feature in
SWAPI 2.0 which provides client identification. Using secure HTTPS
server-client connections with client identification and bilateral
signing keys provides reasonable security and reliability. More
Dobias Informational [Page 3]
Internet-Draft SWAPI 2.1 September 2013
secure algorithms such as HMAC have been intentionally avoided to
provide the widest possible range of implementations.
This document describes both how to make API calls and how to respond
to them. Most developers need only concern themselves with the
former in order to connect to SWAPI systems. All the programming
examples in this document are in PHP but the concepts apply equally
to other languages such as C, Java, Action Script, Cold Fusion, Perl
and any others you care to use.
SWAPI supports the following data types in responses:
o Null
o Strings
o Signed integers
o Signed floating points
o Booleans
o Arrays
o Associative Arrays
o Comments
o Errors
1.1 Purpose
The purpose of SWAPI is to provide an API for web services with the
greatest possible compatibility between hetrogeneous systems that is
easy for a developer to implement and powerful enough to be used in
place of more complex existing technologies such as SOAP.
1.2 Current Usage Examples
SWAPI has been used effectively in the following applications:
o Exposing web services for mobile clients (smartphones).
o Remote control of Interactive Voice Response (IVR) systems.
o Inter-host communication between nodes in a web server cluster.
o Asynchronous Javascript And XML (AJAX) request and responses.
1.3 Terminology
The following terms should be understood as unambiguous in the scope
Dobias Informational [Page 4]
Internet-Draft SWAPI 2.1 September 2013
of this document:
o Call: is the execution of a SWAPI function that is exposed via a
URL. The call includes the HTTP request URL and the URL encoded
arguments.
o Client: is a software program that has implemented support for
making SWAPI function calls and parsing responses.
o GET: is URL encoded arguments passed to a HTTP/S server in the
URL.
o POST: is the URL encoded arguments passed to a HTTP/S server in
the HTTP "Post" header.
o Response: is the payload of text data returned by a SWAPI server
after receiving a function call by a client.
o Request: is synonymous with the word "call".
o Server: is a software program bound to an HTTP/S server that has
implemented support for receiving SWAPI calls and returning
responses.
In addition, the words "MUST", "MUST NOT", "REQUIRED", "SHALL",
"SHALL NOT", "SHOULD" and "SHOULD NOT" denote behaviours which are
mandatory.
The words "RECOMMENDED", "NOT RECOMMENDED", "MAY" and "OPTIONAL"
denote behaviours which are valid but not mandatory.
2 Justification
During the development of various interconnected systems and web
services, it became clear that it was not possible to implement a
common remote procedure call system using established protocols such
as SOAP because these protocols were not consistently implemented
accross different programming languages. To be more specific, the
following problems needed to be addressed:
1. Different remote interfaces often need different mechanisms for
communicating with the same web service. Some interfaces
supported SOAP, while others do not.
2. Using existing technologies such as SOAP, the support for such
technologies would change depending on environment and version
and may require additional external software libraries to
function.
3. Different programming had different requirements for variable
type handling and character set encoding.
Dobias Informational [Page 5]
Internet-Draft SWAPI 2.1 September 2013
4. The simplest environments which run as shell scripts could not
handle calls or response parsing for any established protocol.
Although shell scripts can call simple HTTP URL requests, these
types of simple applications needed to run seperate executables
to handle this type of remote operation.
5. The workload overhead (processor, memory and network) for
XML-based protocols can be heavy due to large XML request and
response payloads, schema validation and XML parsing.
Instead of reinventing new solutions for the same problem or
attempting rationalisation of all interfaces to environments that all
support SOAP with the same feature set, an entirely different
protocol is proposed that resolves the problems described above by
doing the following:
1. It should be simple enough to implement in all programming
languages and most shell scripting environments.
2. It should be possible to make a client or server using very
simple string handling functions and operators built-in to most
programming languages or scripting environments.
3. The server should run over standard HTTP/S [RFC 2616] and the
underlying HTTP server should require little or no configuration
changes.
4. The responses should include variable type casting hints and
string character set declarations which can be used or ignored
depending on the requirements of the programming language.
5. The calls should resemble standard programming language function
calls and support zero or more unnamed arguments in a specific
order.
6. The responses should resemble standard programming language
function return values. That means one single variable is
returned.
3 Data Integrity
SWAPI 2.0 improves on the original SWAPI specification by allowing
for robust verification of communication. These features become more
difficult to implement depending on the language being used to create
the SWAPI client or server. The features provide:
o Request signing & verification - using a shared secret key
o Response signing & verification - using a shared secret key
o Client identification - provides mechanism for a server to
indentify the client
Dobias Informational [Page 6]
Internet-Draft SWAPI 2.1 September 2013
The use of data signing is asynchronous. This means that requests
and responses may have different usage of signing and verification
depending on how a developer implements the features. A request
could be made with signed data and a response could be returned with
no signing implemented at all. Whether implementing a SWAPI client
or the server, the following two policies are available:
o No data integrity: Data is sent as-is. Probably still the most
suitable for backend communication over a trusted network.
o Signing mode: Data transmissions are signed to ensure a faithful
transmission using a key known to both the sender and receiver.
The hash algorithm used is not defined by SWAPI. Therefore
anything from a simple CRC for checking data reliability to
SHA512 for anti-tamper assurance can be implemented.
3.1 Compatibility
The SWAPI specification mandates that any type of client can speak to
any type of server. With the introduction of the new signing mode,
the possibility of feature mismatches arises. A client written in
Action Script may not have access to cryptographic libraries used by
a server written in C++ using signing mode.
Compatibility is assured through the rule of safest assumption. This
rule means that a server operating in signing mode must also accept
standard requests which are not signed. Requests made in signing
mode where the key is not known to the server are processed as if
they had no security. Only an actual failed signature verification
causes an error. The response returned by the server must be in the
same mode as requested by the client or an error is returned if not
available. This would happen if a client requested a signing mode
response from a server that could not respond in signing mode.
3.2 Signing Mode Keys
How the keys are generated and handled for signing mode is not
defined by the SWAPI specification. It is up to the developer to
decide whether they want a single key used for the server and all
clients or different keys for the server and each client or unique
key pairs for each client-server response. The only rule is that the
keys should be comprised of standard ASCII characters and no longer
than 128 bytes long. This allows client developers with basic needs
to hard code a key into their application if necessary.
3.3 Client Identification
Client identification provides a mechanism for the server to know who
is sending requests. Each request identifies the sender so the
server can accept or drop the request accordingly. Servers that use
this feature should simply drop all requests from unknown clients.
Dobias Informational [Page 7]
Internet-Draft SWAPI 2.1 September 2013
This mechanism is mainly for controlling API subscriptions rather
than ensuring data integrity.
4 Making API Calls
Making API function calls is very simple. Each call is related to
one URL with arguments passed as either in the URL as GET data (query
string) or in the HTTP headers as POST data. In some cases a
combination of the two may be used.
4.1 Calling the URL
There are two types of functions: those that take arguments and those
that do not. A function that takes no arguments is called just by
the URL like this:
https://api.examples.asiacomtek.com/ping.api
However a function that takes arguments requires an optional GET
parameter that indicates where all the following arguments are coming
from. The parameter is called "data" and it can take the following
arguments:
0 receive parameters from HTTP headers as POST
POST receive parameters from HTTP headers as POST
1 receive parameters from URL as GET
GET receive parameters from URL as GET
So to call a function that takes arguments, a URL may look like this:
https://api.examples.asiacomtek.com/join_strings.api?data=POST
If the data argument is missing, the data source is assumed to be
POST by default.
There is also another optional argument that provides verbose output
in human readable format. This is flagged by adding the
"verbose=TRUE" GET parameter to the function's URL.
https://api.examples.asiacomtek.com/ping.api?verbose=TRUE
Because verbose output is commented out, it should not affect an
client application provided that the application is able to ignore
lines beginning with the hash (#) character. Verbose output should
be used in development for debugging. For lower traffic systems
verbose output can be left on even in a production environment.
Verbose output can also be useful if logged to provide a human
readable record of API transactions. However, because the format of
the verbose output may change without notice, it should never be used
as input for a parser. A client application should only be sensitive
to the actual return values, which will be discussed later.
Dobias Informational [Page 8]
Internet-Draft SWAPI 2.1 September 2013
4.2 Passing Arguments
Because all arguments sent via the URL as GET data or in the HTTP
headers as POST data they are inherently strings. There are no data
type definitions to worry about for the caller. SWAP function calls
are similar to standard function calls where the argument order is
critical but the argument name has no meaning. Each variable is
passed as n1, n2, n3... and so on. It goes without saying that the
system only allows variables to be passed by value and not by
reference. Take the below PHP-styled function as an example:
<?php
// function to concatenate two strings.
function join_strings($a,$b){
return $a.$b;
}
?>
To call this function within PHP the code may look like this:
<?php
$string1="Hello";
$string2=" World!";
$new_string=join_strings($string1,$string2);
// returns "Hello World!"
?>
Now suppose a web API function does the same thing. The two strings
must be passed in the right order (shown split over multiple lines).
https://api.examples.asiacomtek.com/join_strings.api? \
data=GET&n1=Hello+&n2=+World%21
returns
S|UTF-8|Hello World!
Finally, if sending arguments in the URL as GET data, you should
always remember to URL encode the values. Either encoding as URL or
raw URL is fine.
4.3 Sending Arrays
Sending an array presents no special problem but does require array
type notation in the form of [ ] to be appended to the variable name.
The notation requires the element key and must not be blank. The
following example shows an array with two elements being passed
(shown split over multiple lines).
https://api.examples.asiacomtek.com/send_names.api? \
data=GET&n1[0]=john+smith&n1[1]=Jenny+Jones
Dobias Informational [Page 9]
Internet-Draft SWAPI 2.1 September 2013
An associative array can also be supplied and it may even be required
for some functions.
4.4 Client Identification
A client can also identify itself to the server. Servers that
require this will silently ignore requests that have no
identification or are not authorised. Servers that do not require
this will ignore identifications. Identification is made by adding
the optional GET parameter "token=<client id>". In most cases this
identity token will be supplied by the service provider. The
following example shows the string concatenation function with client
identification (shown split over multiple lines).
https://api.examples.asiacomtek.com/join_strings.api? \
data=GET&token=J238JFJ493KD&n1=Hello& \
n2=+World%21
4.5 Signing Mode API Calls
As well as sending your SWAPI calls over an HTTPS connection, data in
the request can be signed to help the receiver ensure the data is
reliable and was not altered en-route or corrupted. The first thing
to do is to actually sign the arguments. Then attach the signature
to the request and send it as part of the API call.
4.5.1 The Signing Key
The signing key is any ASCII printable string of 128 bytes or less.
This must be shared with the receiver. For example:
J23kj48che48xdih(O'($#(Jidf94idiksjs4j8xd
4.5.2 Signing the API Call
Signing the request is done on the combination of the function name
and arguments. It is similar to a URL query string but with all the
formatting characters removed and no URL encoding. The signing key
is then appended to the string and the signature generated using the
hash algorithm of choice. It must be done as the last action before
making the call otherwise the signature will fail validation at the
server end. Only signature related arguments (sig, sig_hash and
sig_return) are not part of the signed string. The order of the
parameters is also important. The parameter hierarchy is as follows:
o data
o token
o verbose
o n1...
Dobias Informational [Page 10]
Internet-Draft SWAPI 2.1 September 2013
Below is the URL created for the string concatenation function (shown
split over multiple lines).
https://api.examples.asiacomtek.com/join_strings.api? \
data=GET&token=J238JFJ493KD&n1=Hello& \
n2=+World%21
Now the signing version is created (there is no new line between the
last character of the string and the key).
join_strings.api?data=GET&token=J238JFJ493KD& \
n1=Hello&n2= World! \
J23kj48che48xdih(O'($#(Jidf94idiksjs4j8xd
Then a hash of the string is calculated. The example here is a MD5
hash.
f38cd314937f82e9eaf9d6726df047a4
Finally, the signature is attached to the real GET data using the
parameters "sig" and "sig_hash" to tell the server the signature and
the algorithm used to create it.
https://api.examples.asiacomtek.com/join_strings.api? \
data=GET&token=J238JFJ493KD&n1=Hello& \
n2=+World%21&sig= \
a2933195ecd44701490ca55910b57d78&sig_hash=MD5
It is important to note that the function name starts immediately
after the domain name and slash character. Therefore, if a function
was called at the following URL:
https://api.examples.asiacomtek.com:4567/basic/ping.api
Then the reported function name used for singing would be:
basic/ping.api
4.5.3 Requesting the Response Type
The SWAPI server will not provide a signed response unless requested
by the calling function. This is requested by adding the optional
"sig_return=<hash type>" GET parameter to the query string. The
signed query will now look like this:
https://api.examples.asiacomtek.com/join_strings.api? \
data=GET&token=J238JFJ493KD&n1=Hello& \
n2=+World%21&sig= \
a2933195ecd44701490ca55910b57d78& \
sig_hash=MD5&sig_return=MD5
Dobias Informational [Page 11]
Internet-Draft SWAPI 2.1 September 2013
The service provider will provide the list of hash algorithms that
may be requested in the "sig_return" parameter.
4.6 Timeouts
When calling an API function, you must implement your own method for
dealing with server timeouts or other network related errors. For
most web CGI languages, this is built in but you may need to override
this behaviour to enforce something more elegant than an error; such
as a retry or silently caching the request for later.
5 Using Return Values
SWAPI API functions return values in just the same way as regular
program functions do. At their most basic level they can return true
or false to indicate success or failure, or they can return some
other expected value like a string, a number or an array. In section
3.2 we called a function called join_strings that, as the name
suggests, joins strings and we got the following return value:
S|UTF-8|Hello World!
This indicates a string is being returned, encoded in UTF-8 and its
value is "Hello World!". As mentioned earlier, everything is
inherently a string so any desired types must be specifically
included as part of the return value. It is up to the developer to
make use of these type definitions (if at all), but they are present
for every return value. The web API supports 5 variable types. They
are:
o Null
o Strings
o Integers
o Floating points
o Arrays (non indexed, indexed, single dimension, multidimensional,
mixed type & associative)
o Booleans
To make a web API behave as much like a normal function call as
possible, a function will return only one value. If receiving an
array as a return value, each value is terminated by a single new
line (LF). Carriage returns (CR) are not used in SWAPI web API's
output (carriage returns have a special meaning within strings).
Type declaration segments are always delineated using the pipe (|)
character. Because the number of pipes in a type declaration is
known, the pipe character is also valid in the body of the value
itself.
Dobias Informational [Page 12]
Internet-Draft SWAPI 2.1 September 2013
5.1 Null
Null values are returned with the "N" keyword. No other markup is
required. Therefore a null response would simply look like this:
N
5.2 Strings
Strings are returned with the "S" keyword followed by a pipe (|); the
string character encoding; another pipe (|) and then the string
itself.
S|<encoding>|<value>
Examples:
S|UTF-8|This is a string encoded in UTF8
S|iso-2022-jp|Valid and also has a third | which is okay.
Your parser should treat everything from the second pipe (|) onwards
as the string up until the linefeed (LF) character or the end of file
(whichever comes first). The string encoding is also vitally
important for most non-English applications.
5.2.1 Strings with new lines
To avoid confusion with the linefeed character, all new lines are
returned as carriage returns (CR). Even if you pass a string for
processing that contains new lines as linefeeds (LF) they will be
converted to carriage returns (CR) for the return value.
Windows-style carriage return-linefeeds (CRLF) new lines are also
returned as just single carriage returns (CR). Please bear this in
mind and compensate for it if necessary in your application.
Unexpected newline characters are a common cause of bugs.
5.3 Integers
Integers are returned with the "I" keyword followed by a single pipe
(|) character and then the integer itself.
I|<value>
Examples:
I|873458
I|-2342
5.4 Floating Points
Floating point numbers are returned with the "F" keyword followed by
Dobias Informational [Page 13]
Internet-Draft SWAPI 2.1 September 2013
a single pipe (|) character and then the floating point number
itself.
F|<value>
Examples:
F|2342.23
F|-0.5
F|0.0
5.5 Booleans
Booleans represent the simplest return values. A boolean is returned
with the "B" keyword followed by a single pipe (|) character and the
boolean value which will always be either 0 (false) or 1 (true).
B|<value>
Examples:
B|0
B|1
5.6 Arrays
An array is merely a list of values delineated by linefeed (LF)
characters and preceded with the "A" or "K" keywords and suffixed by
the "C" keyword. For single dimension arrays, the "C" keyword is
optional so your parser should recognize both the last line of the
output or the presence of "C" as the end of an array. SWAPI 2.0 adds
indexing and association to arrays which changes the format slightly
from other value types. An indexed array is started using the "A"
keyword and an associative array is started with the "K" keyword.
Multidimensional arrays are shown as blocks of values enclosed within
"A" or "K" and "C" keywords that appear within the body of another
array. SWAPI does not enforce a limit on the maximum length of an
array or the maximum levels of dimensionality an array may have.
A
<element type>|<value>
[C]
or for a multidimensional array
A
A
<element type>|<value>
C
[C]
Examples:
Dobias Informational [Page 14]
Internet-Draft SWAPI 2.1 September 2013
A
S|UTF-8|Monday
S|UTF-8|Tuesday
S|UTF-8|Wednesday
S|UTF-8|Thursday
S|UTF-8|Friday
S|UTF-8|Saturday
S|UTF-8|Sunday
I|435
F|34.5
A
S|UTF-8|Jenny Jones
S|UTF-8|Dirk Bogart
A
S|UTF-8|Ziggy Stardust
I|45
S|UTF-8|January 10, 1963
S|UTF-8|male
C
C
5.6.1 Associative Arrays
Associative arrays have an additional pipe (|) delimited value
containing an index string. This can even be part of another array
declaration. The string must be no longer than 32 bytes and contain
only ASCII alphanumeric and the following characters:
-_.
There must be no white space in this string. Clients that do not
support associative arrays will ignore the keys so the use of these
arrays should be kept to a minimum to ensure maximum compatibility.
K
<key>|<element type>|<value>
[C]
Example:
K
name|S|UTF-8|John Doe
age|I|43
occupation|S|UTF-8|Professional scuba diver
phone|I|555123789
C
5.7 Comments
A comment is any line intended to be readable by humans. Comments
Dobias Informational [Page 15]
Internet-Draft SWAPI 2.1 September 2013
are lines of text commented out in the same way as shell scripts
using the hash (#) character. A parser should ignore any lines
beginning with a hash. The return value of a function with comments
may look like this:
# Ping function called.
# SNS API function by Joey Dobias (joey@alegria.co.jp).
# If you are seeing this message and the time is also correct
# then it means the web server is up and running and this
# response is not cached.
# The return array format is:
# 0 = Web server Timestamp
# 1 = Fileserver status
# 2 = User account database status
# 3 = Stress Check analysis database status
# 4 = Blog database status
# 5 = Messaging database status
# 6 = Podcast database status
# 7 = Admin database status
# 8 = HTTP cluster ping test status
# Standard function return values to follow.
A
S|UTF-8|2007-02-05 07:34:04 (GMT)
S|UTF-8|OK
S|UTF-8|OK
S|UTF-8|OK
S|UTF-8|OK
S|UTF-8|OK
S|UTF-8|OK
S|UTF-8|OK
S|UTF-8|OK
5.8 Errors
Occasionally a function may not complete successfully and will return
an error instead of a normal return value. An error is basically a
string that describes the error and uses the "E" keyword.
E|<encoding>|<value>
Example:
E|UTF-8|Did not receive arguments from client.
5.8.1 Signing Mode Errors
With the exception of signing mode, all errors are application
specific. The following special signing mode errors may be returned
as the only response to an API call:
o SIG-FAIL - Indicates that the data received from the client
failed verification.
o SIG-NO-HASH - Indicates that the hash algorithm requested by
Dobias Informational [Page 16]
Internet-Draft SWAPI 2.1 September 2013
the client is not supported.
In either of these scenarios, no other output (excluding preceding
comments) will be returned.
5.9 Signing Mode Responses
If an API function call requested that the response be signed using
the GET parameter "sig_return" in the URL, then the server will
provide a response in signing mode using the hash algorithm
requested. This will result in the last line in the response (even
after all comments) containing the special signature value.
SIG|<type>|<value>
Example:
SIG|MD5|5765ada1c3974d0a0dde201742bf4999
5.9.1 Verifying a Signature
Signature verification is optional, though clients that do not verify
signatures will probably not request them. Verifying the signature
requires that the client has the same key that the server used sign
the data. The signature is verified by appending the key to the end
of the response output (including all preceding comments), minus the
line containing the signature itself and calculating the checksum.
If the checksum matches the signature, the data is valid. Here is an
example of a received response.
#Ping function called.
A
S|UTF-8|2007-02-05 07:34:04 (GMT)
S|UTF-8|OK
S|UTF-8|OK
S|UTF-8|OK
S|UTF-8|OK
S|UTF-8|OK
S|UTF-8|OK
S|UTF-8|OK
S|UTF-8|OK
SIG|MD5|5765ada1c3974d0a0dde201742bf4999
The client then removes the signature line and appends the shared key.
#Ping function called.
A
S|UTF-8|2007-02-05 07:34:04 (GMT)
S|UTF-8|OK
S|UTF-8|OK
S|UTF-8|OK
S|UTF-8|OK
Dobias Informational [Page 17]
Internet-Draft SWAPI 2.1 September 2013
S|UTF-8|OK
S|UTF-8|OK
S|UTF-8|OK
S|UTF-8|OK
J23kj48che48xdih(O'($#(Jidf94idiksjs4j8xd
A MD5 checksum is calculated (the same algorithm as the received
signature).
5765ada1c3974d0a0dde201742bf4999
In this example, the checksum matches the signature checksum and the
data is confirmed as valid.
6 Creating a SWAPI Compliant Function
Understanding how to call SWAPI functions provides almost enough
knowledge for creating them. This section re-covers some of the
concepts from sections 3 and 4 as well as introduces some other
requirements for creating a SWAPI compliant function.
6.1 The SWAPI Function Files
Regardless of what language your SWAPI function was written in, the
extension should always be ".api". This allows developers to freely
upgrade and change their SWAPI functions including the language they
were written in without it having any effect on the clients that call
the functions. This means that our join_strings.api function (see
section 3.2), which was written in PHP, can be converted to JSP or
Cold Fusion without the client applications that use it having to be
changed or their developers ever having to know about it.
To accomplish this, a web server needs to be configured to treat
anything ending in .api as a CGI file of the programming language you
are using.
6.2 HTTP Headers
The only requirement for HTTP headers is that SWAPI functions should
respond by declaring their content type as plain text. The header
format is:
Content-type: text/plain
The encoding header is not relevant because SWAPI compliant parsers
should be looking at the string declarations in the return output for
their character encoding on a per string basis. The encoding header
only affects the display of human readable comments, which are
probably in English.
6.3 New Lines
Dobias Informational [Page 18]
Internet-Draft SWAPI 2.1 September 2013
New lines in the output must all be single linefeed (LF) characters
with no carriage returns (CR) in the main body of the output. New
lines in strings being returned should always be single carriage
returns (CR). Therefore before returning strings that may contain
new lines, it is very important to convert whatever newline
characters the string uses into single carriage returns (CR)
otherwise the parser will not be able to receive the string
correctly.
6.4 Avoiding Timeouts on Complex Functions
Some functions may take many seconds to process before returning.
This can cause the client parser to fail with a timeout error. To
avoid this, make sure some output is sent to the client right away.
A single comment with the name and version of the function is a good
way to achieve this.
6.5 Returning Null
Null should be returned with the "N" keyword. No other markup is
required. For example:
N
6.6 Returning Strings
Strings should be returned with the "S" keyword followed by a pipe
(|); the string character encoding; another pipe (|) and then the
string itself.
S|<encoding>|<value>
Examples:
S|UTF-8|This is a string encoded in UTF8
S|iso-2022-jp|Valid and also has a third | which is okay.
Bad examples:
# The character set declaration has been omitted.
S|This string is missing a pipe and a character set declaration.
# This string also misses the character set declaration and the
# second pipe makes the parser think the character set is "
# This string misses out a".
S|This string misses out a | which causes an error on next pipe.
6.7 Returning Integers
Integers should be returned with the "I" keyword followed by a single
pipe (|) character and then the integer itself.
Dobias Informational [Page 19]
Internet-Draft SWAPI 2.1 September 2013
I|<value>
Examples:
I|873458
I|-2342
Bad examples:
# A floating point where an integer should be.
I|3453.3453
# A string where an integer should be.
I|This isn't an integer
6.8 Returning Floating Points
Floating point numbers should be returned with the "F" keyword
followed by a single pipe (|) character and then the floating point
number itself.
F|<value>
Examples
F|2342.23
F|-0.5
F|0.0
Bad examples:
# Is an integer
F|0
# Is a string
F|This isn't a float
6.9 Returning Booleans
A boolean should be returned with the "B" keyword followed by a
single pipe (|) character and the boolean value which will always be
either 0 (false) or 1 (true).
B|<value>
Examples:
B|0
Dobias Informational [Page 20]
Internet-Draft SWAPI 2.1 September 2013
B|1
Bad examples:
# Enumerated TRUE/FALSE strings are not valid booleans
B|FALSE
B|TRUE
6.10 Returning Arrays
Arrays should be returned as a list of values delineated by linefeed
(LF) characters and preceded with the "A" or "K" keywords and
suffixed by the "C" keyword. For single dimension arrays, the "C"
keyword is optional. Multidimensional arrays are returned as blocks
of values enclosed within "A" or "K" and "C" keywords that appear
within the body of another array. SWAPI does not enforce a limit on
the maximum length of an array or the maximum levels of
dimensionality an array may have.
A
<element type>|<value>
[C]
or for a multidimensional array
A
A
<element type>|<value>
C
[C]
Examples:
A
S|UTF-8|Monday
S|UTF-8|Tuesday
S|UTF-8|Wednesday
S|UTF-8|Thursday
S|UTF-8|Friday
S|UTF-8|Saturday
S|UTF-8|Sunday
I|435
F|34.5
A
S|UTF-8|Jenny Jones
S|UTF-8|Dirk Bogart
A
S|UTF-8|Ziggy Stardust
I|45
S|UTF-8|January 10, 1963
Dobias Informational [Page 21]
Internet-Draft SWAPI 2.1 September 2013
S|UTF-8|male
C
C
Bad examples:
# ARRAY keyword must be on its own line
A|S|UTF-8|Monday
S|UTF-8|Tuesday
S|UTF-8|Wednesday
# Forget to use CLOSE-ARRAY keyword when describing a
# multidimensional array.
A
I|435
F|34.5
A
S|UTF-8|Index values for bookmark
I|456
F|-0.001
C
6.10.1 Associative Arrays
Associative arrays have an additional pipe (|) delimited value
containing an index string. This can even be part of another array
declaration. The string must be no longer than 32 bytes and contain
only ASCII alphanumeric and the following characters:
-_.
There must be no white space in this string. Clients that do not
support associative arrays will ignore the keys so the use of these
arrays should be kept to a minimum to ensure maximum compatibility.
Other rules are the same as for standard arrays.
K
<key>|<element type>|<value>
[C]
Examples:
K
name|S|UTF-8|John Doe
age|I|43
occupation|S|UTF-8|Professional scuba diver
phone|I|555123789
C
A
K
first_name|S|UTF-8|John
Dobias Informational [Page 22]
Internet-Draft SWAPI 2.1 September 2013
last_name|S|UTF-8|Doe
age|I|43
C
K
first_name|S|UTF-8|Sue
last_name|S|UTF-8|Pollard
age|I|29
C
C
A
0|K
first_name|S|UTF-8|John
last_name|S|UTF-8|Doe
age|I|43
C
1|K
first_name|S|UTF-8|Sue
last_name|S|UTF-8|Pollard
age|I|29
C
C
6.11 Showing Comments
Comments can be inserted in much the same way as shell scripts using
the hash (#) character. An example of a commented function may look
like this:
# Ping function called.
# SNS API function by Joey Dobias (joey@alegria.co.jp).
# If you are seeing this message and the time is also correct
# then it means the web server is up and running and this
# response is not cached.
# The return array format is:
# 0 = Web server Timestamp
# 1 = Fileserver status
# 2 = User account database status
# 3 = Stress Check analysis database status
# 4 = Blog database status
# 5 = Messaging database status
# 6 = Podcast database status
# 7 = Admin database status
# 8 = HTTP cluster ping test status
#Standard function return values to follow.
A
S|UTF-8|2007-02-05 07:34:04 (GMT)
S|UTF-8|OK
S|UTF-8|OK
S|UTF-8|OK
S|UTF-8|OK
S|UTF-8|OK
Dobias Informational [Page 23]
Internet-Draft SWAPI 2.1 September 2013
S|UTF-8|OK
S|UTF-8|OK
S|UTF-8|OK
Comments can be placed on any line of the output to help in debugging
and logging. However, if a response is sent is signing mode, no
comments can be output after the signature.
6.12 Receiving Arguments
Arguments may be received either in the URL query string as GET data
or in the HTTP header as POST data. SWAPI functions should accept
both as possible input sources with the argument location being
explicitly declared in the URL GET parameter called "data". If the
client calls a SWAPI function and does not declare where the
arguments are located, your function should default to POST data in
the HTTP header and if arguments are not found, should return an
error. Valid input for the data parameter is:
0 receive parameters from HTTP headers as POST
POST receive parameters from HTTP headers as POST
1 receive parameters from URL as GET
GET receive parameters from URL as GET
SWAPI functions can then parse the input in any way necessary. A
function must ignore all variables that are not explicitly requested.
So if a function which takes three arguments is called it must parse
and validate only the first three arguments, even if the client
passes extra arguments to the function. The arguments received will
be labelled consecutively with the letter "n" following by a number
stating at 1 (n1, n2, n3... etc.).
Remember to remove slashes from escaped characters or decode URL
encoded strings back into normal text before processing the
arguments.
6.13 Identifying the Client
A SWAPI 2.0 service provider can request that all clients identify
themselves in the URL with the GET parameter "token=<client id>".
The content of this parameter and how it is handled is up to the
service provider to decide. The original intended usage was for the
service provider to allocate a license code to each organisation that
had a formal agreement to use the SWAPI API. A service provider
could then drop requests from unlicensed clients or from clients with
expired contracts. See the API call below:
https://api.examples.asiacomtek.com/ping.api?token=PQNDHUOREN38
SWAPI servers that do not implement client identification should
ignore this parameter.
Dobias Informational [Page 24]
Internet-Draft SWAPI 2.1 September 2013
6.14 Receiving Signing Mode Requests
The client may request a response sent in signing mode by including
the optional GET parameter "sig_return" in the URL. The value of the
parameter should be a hash algorithm known to the server. See the
API call below:
https://api.examples.asiacomtek.com/ping.api?sig_return=SHA256
Handling the request should follow these rules:
o If signing mode is not supported, the "sig_return" parameter is
ignored.
o If signing mode is supported but a signing key is not available
(when signing keys are specific to the client), the "sig_return"
parameter is ignored. If signing mode is supported but there the
algorithm is not supported, a SIG-NO-HASH error is returned. No
other output other than preceding comments are permitted.
o If signing mode is supported and a signing key is available, a
response is sent in signing mode.
6.15 Receiving Signed API Calls
The client may send an API call in signing mode indicated by the GET
parameter "sig" in the URL. If processed, this must be accompanied
by the "sig_hash" parameter. See the API call below (shown on
multiple lines):
https://api.examples.asiacomtek.com/join_strings.api?data=GET& \
token=J238JFJ493KD&n1=Hello&n2=+World%21&sig= \
f38cd314937f82e9eaf9d6726df047a4&sig_hash=MD5
Handling the request should follow these rules:
o If signing mode is not supported, the "sig" and "sig_hash"
parameters are ignored.
o If signing mode is supported but a signing key is not available,
the "sig" and "sig_hash" parameters are ignored.
o If signing mode is supported but the "sig_hash" parameter is
missing or contains an unsupported algorithm, a SIG-NO-HASH error
is returned. No other output other than preceding comments are
permitted.
o If signing mode is supported and a signing key is available, then
the data signature is verified for authenticity.
6.15.1 Verifying a Signature
Dobias Informational [Page 25]
Internet-Draft SWAPI 2.1 September 2013
Verifying a request is done on the combination of the function name
and arguments. It is similar to a URL query string but with all the
formatting characters removed and no URL encoding. The signing key
is then appended to the string and the signature generated using the
checksum requested by the client. This requires that the server has
the same signing key used by the client. Only signature related
arguments (sig, sig_hash and sig_return) are not part of the signed
string. The order of the parameters is also important. The
parameter hierarchy is as follows:
o data
o token
o verbose
o n1...
For example, the following API call is received (shown on multiple
lines).
https://api.examples.asiacomtek.com/join_strings.api?data=GET& \
token=J238JFJ493KD&n1=Hello&n2=+World%21&sig= \
f38cd314937f82e9eaf9d6726df047a4&sig_hash=MD5&sig_return=MD5
Now the signing version is created with the shared key (there is no
new line between the last character of the string and the key).
join_strings.api?data=GET&token=J238JFJ493KD&n1=Hello&n2=+World! \
J23kj48che48xdih(O'($#(Jidf94idiksjs4j8xd
Then a hash of the string is calculated. The example here is a MD5
hash.
f38cd314937f82e9eaf9d6726df047a4
Finally, the signature is compared to the value of the "sig"
parameter. If the values are the same, then SWAPI server processes
the request. Otherwise the error SIG-FAIL is returned as the only
response other than comments.
6.16 Responding in Signing Mode
A SWAPI server will provide a response in signing mode using the hash
algorithm requested in the GET parameter "sig_return". This will
result in the last line in the response (even after all comments)
containing the special signature value.
SIG|<type>|<value>
Example:
Dobias Informational [Page 26]
Internet-Draft SWAPI 2.1 September 2013
SIG|MD5|5765ada1c3974d0a0dde201742bf4999
6.16.1 Signing a Response
Signing the response is done by appending the key to the end of the
response output (including all comments), minus the line containing
the signature itself and calculating the checksum. Here is an
example of a signing mode response.
The response is generated
#Ping function called.
A
S|UTF-8|2007-02-05 07:34:04 (GMT)
S|UTF-8|OK
S|UTF-8|OK
S|UTF-8|OK
S|UTF-8|OK
S|UTF-8|OK
S|UTF-8|OK
S|UTF-8|OK
S|UTF-8|OK
The server appends the signing key to a new line.
#Ping function called.
A
S|UTF-8|2007-02-05 07:34:04 (GMT)
S|UTF-8|OK
S|UTF-8|OK
S|UTF-8|OK
S|UTF-8|OK
S|UTF-8|OK
S|UTF-8|OK
S|UTF-8|OK
S|UTF-8|OK
J23kj48che48xdih(O'($#(Jidf94idiksjs4j8xd
An MD5 checksum is calculated (the same algorithm as the received
signature).
5765ada1c3974d0a0dde201742bf4999
Then the signed response is sent to the client.
#Ping function called.
A
S|UTF-8|2007-02-05 07:34:04 (GMT)
S|UTF-8|OK
S|UTF-8|OK
S|UTF-8|OK
S|UTF-8|OK
Dobias Informational [Page 27]
Internet-Draft SWAPI 2.1 September 2013
S|UTF-8|OK
S|UTF-8|OK
S|UTF-8|OK
S|UTF-8|OK
SIG|MD5|5765ada1c3974d0a0dde201742bf4999
6.17 Implementing a Verbose Mode
Including a verbose mode into a function is not required for SWAPI
but it is good practice. Because the server and client may be
separated by great distance and time zones, SWAPI functions should
help the client-side developers as much as possible by providing well
documented output to their return values. A SWAPI function that
supports verbose output should detect the presence of a GET perimeter
called "verbose=TRUE". See the API call below:
https://api.examples.asiacomtek.com/ping.api?verbose=TRUE
6.18 Returning an Error
If for some reason a function fails, it should return an error
instead of any other return value. An error is just a string with
"E" keyword. The string that describes the error should be brief and
easy to understand.
E|<encoding>|<value>
Example:
E|UTF-8|Did not receive arguments from client.
7 Security Considerations
The SWAPI protocol is inherently non secure by design. Although an
optional data integrity assurance mechanism is provided, the payload
of the calls and responses are (on the SWAPI level) in plain text.
For this reason, the use of the security features of the underlying
HTTP protocol in HTTPS mode or additional tunnelling is strongly
encouraged. Using features such as standard HTTPS, client
certificates, and additional tunnelling, the SWAPI exchanges can be
made as secure as the underlying application layer. This document
does not describe the usage of HTTPS or certificate-base
authentication.
Other security considerations relate to the implementation of the
SWAPI service itself. The implement or of a web service has the
responsibility to ensure intelligent design decisions when
determining what functions to expose and how to validate function
arguments.
8 IANA Considerations
Dobias Informational [Page 28]
Internet-Draft SWAPI 2.1 September 2013
At this time, no changes to the IANA registry are required for this
purely informational draft.
Appendix A) Allowable character sets
A SWAPI application does not need to support more than one character
set (our example code in this document only supports UTF-8).
Whatever character sets it does support should conform to the
notation of character sets exactly as show below. In other words, to
declare UTF-8, you must use "UTF-8" and not "UTF8" or "UTF 8".
Otherwise the client might not understand which character set you are
declaring for a given string.
o UTF-32
o UTF-32BE
o UTF-32LE
o UTF-16
o UTF-16BE
o UTF-16LE
o UTF-7
o UTF-8
o ASCII
o EUC-JP
o SJIS
o ISO-2022-JP
o JIS
o ISO-8859-1
o ISO-8859-2
o ISO-8859-3
o ISO-8859-4
o ISO-8859-5
o ISO-8859-6
Dobias Informational [Page 29]
Internet-Draft SWAPI 2.1 September 2013
o ISO-8859-7
o ISO-8859-8
o ISO-8859-9
o ISO-8859-10
o ISO-8859-13
o ISO-8859-14
o ISO-8859-15
o BASE64
o EUC-CN
o CP936
o HZ
o EUC-TW
o BIG-5
o EUC-KR
o ISO-2022-KR
o KOI8-R
References
1. [RFC 2616] Fielding, R. et al. "Hypertext Transfer Protocol --
HTTP/1.1" (June 1999)
Author's Address
Joey A. Dobias
905 1-16-5 Higashi-sakashita
Itabashi-ku
Tokyo, 174-0042
Japan
E-mail: feeling_zenjp@yahoo.co.jp
Document expires: April 2, 2014
Dobias Informational [Page 30]