UserPreferences

PaceAtomActionHeader


Abstract

This proposal simplifies the PacePutDelete and provides a way for clients that are unable to use PUT and DELETE to access the Atom API.

Author: JanneJalkanen (with big chunks copied from JoeGregorio's PacePutDelete).

Status

Open

Rationale

As has already been noted in PacePutDelete, many clients, most notably mobile clients using Java MIDP 1.0 and 2.0 cannot use other HTTP verbs than GET, HEAD, and POST. Requiring that all clients must use PUT and DELETE would mean cutting out a very important platform for future mobile users [1]. It also seems to be a problem with some client and server platforms [2], as well as some implementations [4].

However, bringing in SOAP completely is not a very good idea, as it adds an unnecessary layer of complexity into the Atom API. PacePutDelete suggested an <atom:action> -element to be added, but that has the distinct disadvantages of 1. requiring parsing of the entire message before you know what to do with it, and 2. it makes handling of binary objects (like in PaceSimpleResourcePosting) difficult [3], as it requires that an XML wrapper is always added, which forces thedata to be base64-encoded. (Which is a bad idea for mobile clients, which are exactly the ones that need this workaround).

PacePutDelete however introduces an alternate proposal, the use of an X-Atom-Action header to produce a similar result to the <atom:action>-element. This works very well from both a parsing standpoint, as well as from a mobile client point of view, and it does not mess up the suggested binary upload protocols either. This proposals opens it up again.

[1] : http://www.imc.org/atom-syntax/mail-archive/msg07177.html
[2] : http://www.imc.org/atom-syntax/mail-archive/msg07238.html
[3] : http://www.imc.org/atom-syntax/mail-archive/msg07109.html
[4] : http://www.imc.org/atom-syntax/mail-archive/msg07236.html

Proposal

Replace section 7.1 with the following:

7.1 Restricted Client Enabling

Servers MUST support the following alternate interface mechanisms to enable a wider variety of clients to interact with AtomAPI servers. The following requirements are in addition to the ones listed in the Functional Specification Section.

7.1.1 Servers
  1. All servers MUST support the limited use of the Atom-Action -header as detailed below.

7.1.2 Clients
  1. Clients MUST support GET and POST in all the places specified in the Functional Specification Section.

  2. Clients SHOULD use the HTTP methods PUT and DELETE when possible. When not possible, they MAY use POST and include an Atom-Action header which may contain the value of "PUT" or "DELETE" to reflect the desired action.

  3. The Atom-Action header can only be used in conjunction with a POST.

  4. The value of Atom-Action header is case-sensitive.

Examples

Canonical

Here is how DELETING an entry is done now.

DELETE /path/myLastEntry.atomapi HTTP/1.0 
Host: example.com

Alternate

This is how it can be done from a client that does not support PUT/DELETE.

POST /path/myLastEntry.atomapi HTTP/1.0
Content-type: application/atom+xml; charset=utf-8
Atom-Action: DELETE

Canonical

Here is how to PUT an entry now.

PUT http://example.com/myRecentEntry HTTP/1.0
Host: example.com

<?xml version="1.0" encoding='utf-8'?>
<entry xmlns="http://purl.org/atom/ns#">
  <title>Some Entry</title>
  <id>http://example.com/myRecentEntry</id>
  <issued>2003-09-08T03:32:51Z</issued>
  <content type="text/plain">This is just an example.</content>
</entry>

Alternate

This is how it can be done from a client that does not support PUT/DELETE.

POST http://example.com/myRecentEntry HTTP/1.0
Content-type: application/atom+xml; charset=utf-8
Atom-Action: PUT
        
<?xml version="1.0" encoding='utf-8'?>
<entry xmlns="http://purl.org/atom/ns#">
  <title>Some Entry</title>
  <id>http://example.com/myRecentEntry</id>
  <issued>2003-09-08T03:32:51Z</issued>
  <content type="text/plain">This is just an example.</content>
</entry>

Impacts

* Current REST based implementations of the client and server will need to add processing for the Atom-Action -header. * REST implementations will have to reconcile the action tag (if present) with the http method.

Notes

The algorithm for defining the functionality is rather simple (pseudocode follows):

  action = request.getParameter( "Atom-Action" )
  method = request.getMethod()
  
  if ($action == "PUT" || $action == "DELETE") && $method == "POST"
     method = $action
     
  // This is already normal processing after this
  
  switch( $method )
     case "PUT"
        doPut()
     case "DELETE"
        doDelete()
     case "GET"
        doGet()
     case "HEAD"
        doHead()
     case "POST"
        doPost()
     default
        showHorribleErrorAndDieScreaming()

For a CGI script the situation would look as follows (thanks to SamRuby for pointing this out):

> How could something like Movable Type support the following?
> 
> POST /images/foo.jpg HTTP/1.1
> Content-type: image/jpg
> Atom-Action: PUT 

The following environment variables would be set:

  REQUEST_URI=/images/foo.jpg
  CONTENT_TYPE=image/jpg
  HTTP_ATOM_ACTION=PUT

image itself would be available as stdin 

Limitations

The solution works on all client platforms that allow setting custom HTTP headers. Platforms known to have issues with this (AND are unable to use PUT and DELETE) are:

Big question: while HTTP says that proxies SHOULD NOT remove/modify headers, are there any gateways that actually do that? Apparently an old version of RIM Blackberry Enterprise Gateway did, but this is not believed to be widely deployed. Anything else?


CategoryProposals