+static int
+uri_is_absolute (char *uri)
+{
+ return (*uri != '/');
+}
+
+static char *
+getbaseurl (void)
+{
+ char *uri = NULL;
+ char *request_uri = getenv ("REQUEST_URI");
+ char *path = getenv ("PATH_INFO");
+ char *host = getenv ("HTTP_HOST");
+ char *server = getenv ("SERVER_NAME");
+ char *sport = getenv ("SERVER_PORT");
+ int port;
+ if (sport)
+ {
+ port = strtol (sport, NULL, 0);
+ }
+ else
+ {
+ port = 0;
+ }
+ if (request_uri == NULL)
+ return NULL;
+ if (uri_is_absolute (request_uri))
+ {
+ uri = strdup (request_uri);
+ }
+ else if (host)
+ {
+ asprintf (&uri, "http://%s%s", host, request_uri);
+ }
+ else if (server && port != 0 && port != 80)
+ {
+ asprintf (&uri, "http://%s:%d%s", server, port, request_uri);
+ }
+ else if (server)
+ {
+ asprintf (&uri, "http://%s%s", server, request_uri);
+ }
+ if (path && uri)
+ {
+ size_t pathl = strlen (path);
+ size_t uril = strlen (uri);
+ if (!strncmp (uri + uril - pathl, path, pathl))
+ {
+ *(uri + uril - pathl) = 0;
+ }
+ }
+ return uri;
+}
+
+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);
+}
+