From: Thadeu Lima de Souza Cascardo Date: Sun, 26 Oct 2008 17:07:37 +0000 (-0200) Subject: Handle POST requests in the core X-Git-Url: http://git.cascardo.eti.br/?p=cascardo%2Fatompub.git;a=commitdiff_plain;h=e81b3f96293312131cab32ef401c3ead66551378 Handle POST requests in the core --- diff --git a/atom/core.c b/atom/core.c index e9199b2..b2289b4 100644 --- a/atom/core.c +++ b/atom/core.c @@ -48,6 +48,45 @@ void atom_get (AtomCtx *ctx, AtomRequest *request) } } +static void +atom_post (AtomCtx *ctx, AtomRequest *request) +{ + AtomError *error; + /* Publish requests go to the same IRI as the feed IRI */ + if (!atom_is_feed (ctx, atom_request_request (request))) + { + error = atom_error_new (); + atom_error_code_set (error, 400); + atom_error_message_set (error, "Bad Request"); + atom_error_set (ctx, error); + } + else + { + char *content = NULL; + size_t len = 0; + AtomEntry *entry; + atom_request_content (request, &content, &len); + /* TODO: If the content is not an Atom Entry, consider it a media + * publish request */ + entry = atom_entry_new_data_len (content, len); + if (entry == NULL) + { + error = atom_error_new (); + atom_error_code_set (error, 400); + atom_error_message_set (error, "Bad Request"); + atom_error_set (ctx, error); + } + else + { + atom_publish_entry (ctx, atom_request_request (request), entry); + /* TODO: Entry should be the backend representation and more + * information should be given to the frontend */ + if (!atom_error_get (ctx)) + atom_handle_publish (ctx, entry); + } + } +} + void atom_serve_request (AtomCtx *ctx) { @@ -56,12 +95,16 @@ atom_serve_request (AtomCtx *ctx) request = atom_get_request (ctx); if (request != NULL) { - if (atom_request_type (request) == ATOM_REQUEST_GET) + int type = atom_request_type (request); + switch (type) { + case ATOM_REQUEST_GET: atom_get (ctx, request); - } - else - { + break; + case ATOM_REQUEST_POST: + atom_post (ctx, request); + break; + default: error = atom_error_new (); atom_error_code_set (error, 501); atom_error_message_set (error, "Not Implemented");