Implemented POST request in CGI frontend
authorThadeu Lima de Souza Cascardo <cascardo@holoscopio.com>
Mon, 13 Oct 2008 04:40:51 +0000 (01:40 -0300)
committerThadeu Lima de Souza Cascardo <cascardo@holoscopio.com>
Mon, 13 Oct 2008 04:40:51 +0000 (01:40 -0300)
frontend/cgi/cgi.c

index 76380ba..9338f4d 100644 (file)
 
 #include <atompub/atom.h>
 
+#include <glib.h>
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
 
+static void
+cgi_request_content_set (AtomCtx *ctx, AtomRequest *request)
+{
+  GIOChannel *channel;
+  GError *error = NULL;
+  gchar *data;
+  gsize len;
+  channel = g_io_channel_unix_new (0);
+  if (g_io_channel_read_to_end (channel, &data, &len, &error) !=
+      G_IO_STATUS_NORMAL)
+    {
+      AtomError *aerr = atom_error_new_from_gerror (error);
+      g_io_channel_unref (channel);
+      atom_error_set (ctx, aerr);
+      g_error_free (error);
+      return;
+    }
+  atom_request_content_set (request, data, len);
+  g_io_channel_unref (channel);
+  g_free (data);
+}
+
 static AtomRequest *
 cgi_get_request (AtomCtx *ctx)
 {
   AtomError *error;
   char *method = getenv ("REQUEST_METHOD");
   char *path = getenv ("PATH_INFO");
-  int type;
-  char *request;
+  AtomRequest *request;
   if (method == NULL)
     {
       error = atom_error_new ();
@@ -47,6 +70,17 @@ cgi_get_request (AtomCtx *ctx)
       /* Remove the leading slash before mapping */
       return atom_request_new (ATOM_REQUEST_GET, path + 1);
     }
+  else if (!strcmp (method, "POST"))
+    {
+      request = atom_request_new (ATOM_REQUEST_POST, path + 1);
+      cgi_request_content_set (ctx, request);
+      if (atom_error_get (ctx) != NULL)
+        {
+          atom_request_delete (request);
+          return NULL;
+        }
+      return request;
+    }
   error = atom_error_new ();
   atom_error_code_set (error, 501);
   atom_error_message_set (error, "Not Implemented");