X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=frontend%2Fcgi%2Fcgi.c;h=76380bab4a541eda43e2dff2d10c89977c39dc5c;hb=1998069911275d08a542e365928e52ba133e7664;hp=238ac39c1dd938189c396fb197d02e0ec72f1bd0;hpb=e868641b28f8fa86b2b274d6ecb289bbaab2eb35;p=cascardo%2Fatompub.git diff --git a/frontend/cgi/cgi.c b/frontend/cgi/cgi.c index 238ac39..76380ba 100644 --- a/frontend/cgi/cgi.c +++ b/frontend/cgi/cgi.c @@ -24,48 +24,100 @@ #include #include -void -cgi_serve_request (AtomCtx *ctx) +static AtomRequest * +cgi_get_request (AtomCtx *ctx) { + AtomError *error; char *method = getenv ("REQUEST_METHOD"); char *path = getenv ("PATH_INFO"); + int type; + char *request; if (method == NULL) - return; - if (path == NULL) { - path = atom_config_get_str (ctx, "cgi", "index"); + error = atom_error_new (); + atom_error_code_set (error, 400); + atom_error_message_set (error, "Bad Request"); + atom_error_set (ctx, error); + return NULL; } + if (path == NULL || *path == '\0') + path = "/"; if (!strcmp (method, "GET")) { - IRI *iri = iri_new (); - Atom *atom; - GError *error; - iri_set_path (iri, path); - atom = atom_retrieve_resource (ctx, iri); - iri_delete (iri); - if (atom) - { - char *header = "Content-type: application/atom+xml\n\n"; - write (1, header, strlen (header)); - write (1, atom_string (atom), atom_len (atom)); - atom_delete (atom); - } - else if ((error = atom_error_get (ctx)) != NULL) - { - if (error->domain == G_FILE_ERROR && - (error->code == G_FILE_ERROR_EXIST || - error->code == G_FILE_ERROR_ACCES || - error->code == G_FILE_ERROR_PERM)) - fprintf (stdout, "Status: 403 %s\n\n", error->message); - else if (error->domain == G_FILE_ERROR && - error->code == G_FILE_ERROR_NOENT) - fprintf (stdout, "Status: 404 %s\n\n", error->message); - else - fprintf (stdout, "Status: 500 %s\n\n", error->message); - } + /* Remove the leading slash before mapping */ + return atom_request_new (ATOM_REQUEST_GET, path + 1); + } + error = atom_error_new (); + atom_error_code_set (error, 501); + atom_error_message_set (error, "Not Implemented"); + atom_error_set (ctx, error); + return NULL; +} + +static void +cgi_handle_error (AtomCtx *ctx) +{ + AtomError *error; + if ((error = atom_error_get (ctx)) != NULL) + { + int code = atom_error_code (error); + char *message = atom_error_message (error); + fprintf (stdout, "Status: %d %s\n\n%s\n", code, message, message); } else { - fprintf (stdout, "Status: 501 Not Implemented\n\n"); + fprintf (stdout, "Status: 500 Server error\n\nServer error\n"); } } + +static void +cgi_write_header (void) +{ + char *header; + header = "Content-type: application/atom+xml\n\n"; + write (1, header, strlen (header)); +} + +static void +cgi_handle_entry (AtomCtx *ctx, AtomEntry *entry) +{ + char * str; + size_t len; + cgi_write_header (); + atom_entry_string (entry, &str, &len); + atom_entry_delete (entry); + write (1, str, len); + g_free (str); +} + +static void +cgi_handle_feed (AtomCtx *ctx, AtomFeed *feed) +{ + char * str; + size_t len; + cgi_write_header (); + atom_feed_string (feed, &str, &len); + atom_feed_delete (feed); + write (1, str, len); + g_free (str); +} + +static int +cgi_is_feed (AtomCtx *ctx, char *req) +{ + return (req == NULL || *req == '\0'); +} + +AtomFrontend * +cgi_frontend (void) +{ + AtomFrontend *frontend; + frontend = atom_frontend_new (); + atom_frontend_map_entries_set (frontend, atom_map_frontend_requests); + atom_frontend_is_feed_set (frontend, cgi_is_feed); + atom_frontend_get_request_set (frontend, cgi_get_request); + atom_frontend_handle_error_set (frontend, cgi_handle_error); + atom_frontend_handle_entry_set (frontend, cgi_handle_entry); + atom_frontend_handle_feed_set (frontend, cgi_handle_feed); + return frontend; +}