2 * Copyright (C) 2007 Thadeu Lima de Souza Cascardo <cascardo@holoscopio.com>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License along
15 * with this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 #include <atompub/atom.h>
28 cgi_serve_request (AtomCtx *ctx)
30 char *method = getenv ("REQUEST_METHOD");
31 char *path = getenv ("PATH_INFO");
36 if ((path = atom_config_get_str (ctx, "cgi", "index")) == NULL)
38 /* We do not want to disclose our configuration is empty.
39 * The requester cannot distinguish an empty configuration
40 * from a non-existent index.
42 fprintf (stdout, "Status: 404 Not Found\n\n");
46 if (!strcmp (method, "GET"))
49 AtomEntry *entry = NULL;
50 AtomFeed *feed = NULL;
53 if (atom_is_feed (ctx, path))
55 feed = atom_retrieve_feed (ctx);
59 /* Remove the leading slash before mapping */
60 id = atom_id_new_from_frontend (ctx, path + 1);
61 if (id == NULL || (req = atom_id_to_backend (ctx, id)) == NULL)
63 error = atom_error_new ();
64 atom_error_code_set (error, 404);
65 atom_error_message_set (error, "Resource not found");
66 atom_error_set (ctx, error);
70 entry = atom_retrieve_entry (ctx, req);
82 atom_entry_string (entry, &str, &len);
83 atom_entry_delete (entry);
87 atom_feed_string (feed, &str, &len);
88 atom_feed_delete (feed);
90 header = "Content-type: application/atom+xml\n\n";
91 write (1, header, strlen (header));
95 else if ((error = atom_error_get (ctx)) != NULL)
97 int code = atom_error_code (error);
98 char *message = atom_error_message (error);
99 fprintf (stdout, "Status: %d %s\n\n%s\n", code, message, message);
103 fprintf (stdout, "Status: 500 Server error\n\nServer error\n");
108 fprintf (stdout, "Status: 501 Not Implemented\n\n");
113 cgi_is_feed (AtomCtx *ctx, char *req)
115 return (strcmp (req, "/") == 0);
121 AtomFrontend *frontend;
122 frontend = atom_frontend_new ();
123 atom_frontend_map_entries_set (frontend, atom_map_frontend_requests);
124 atom_frontend_is_feed_set (frontend, cgi_is_feed);