A Content-less PUT that returns 201 or 409

Thursday, 14th March, 2013

Thanks to people on the webmachine mailing-list, wmtrace, and the webmachine source (it really does implement the diagram!).

This webmachine resource accepts a PUT request to create a new resource. No content and no content headers are required in the request. A successful request returns 201, and the new resource is accessible at the same url as the PUT. If the resource already exists a 409 is returned.


-module(dragon_resource).
-export([init/1, 
         allowed_methods/2,
         content_types_accepted/2,
         accept_content/2,
         resource_exists/2
	]).

-include_lib("webmachine/include/webmachine.hrl").

init([]) ->
    {ok, undefined}.

allowed_methods(ReqData, Context) -> 
    {['PUT'], ReqData, Context}.

content_types_accepted(ReqData, Context) ->
    {[{"application/octet-stream", accept_content}], ReqData, Context}.

accept_content(ReqData, Context) ->
    {false, ReqData, Context}.

resource_exists(ReqData, Context) ->
    Name = wrq:path_info(name, ReqData),
    case dragon:create(Name) of
        ok ->
            NewReqData = wrq:set_resp_header("Location",
                                             wrq:path(ReqData),
                                             ReqData),
            {false, NewReqData, Context};
        error ->
            {{halt, 409},  ReqData, Context}
    end.

The relevant dispatch.conf line is:

{["here", "be", "dragons", name], dragon_resource, []}.

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.