return;
if (path == NULL)
{
- path = atom_config_get_str (ctx, "cgi", "index");
+ if ((path = atom_config_get_str (ctx, "cgi", "index")) == NULL)
+ {
+ /* We do not want to disclose our configuration is empty.
+ * The requester cannot distinguish an empty configuration
+ * from a non-existent index.
+ */
+ fprintf (stdout, "Status: 404 Not Found\n\n");
+ return;
+ }
}
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);
+ AtomID *id;
+ AtomEntry *atom;
+ AtomError *error;
+ char *req;
+ id = atom_id_new_from_frontend (ctx, path);
+ if (id == NULL || (req = atom_id_to_backend (ctx, id)) == NULL)
+ {
+ atom = NULL;
+ error = atom_error_new ();
+ atom_error_code_set (error, 404);
+ atom_error_message_set (error, "Resource not found");
+ atom_error_set (ctx, error);
+ }
+ else
+ {
+ atom = atom_retrieve_entry (ctx, req);
+ }
+ if (id != NULL)
+ atom_id_delete (id);
if (atom)
{
+ char * str;
+ size_t len;
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);
+ atom_entry_string (atom, &str, &len);
+ write (1, str, len);
+ g_free (str);
+ atom_entry_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);
+ 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: 500 Server error\n\nServer error\n");
}
}
else
fprintf (stdout, "Status: 501 Not Implemented\n\n");
}
}
+
+AtomFrontend *
+cgi_frontend (void)
+{
+ AtomFrontend *frontend;
+ frontend = atom_frontend_new ();
+ atom_frontend_map_entries_set (frontend, atom_map_frontend_requests);
+ return frontend;
+}