Get Base URL from HTTP Headers
authorThadeu Lima de Souza Cascardo <cascardo@holoscopio.com>
Sat, 11 Oct 2008 22:39:50 +0000 (19:39 -0300)
committerThadeu Lima de Souza Cascardo <cascardo@holoscopio.com>
Sun, 26 Oct 2008 18:15:38 +0000 (16:15 -0200)
frontend/cgi/cgi.c

index 9338f4d..9b1b8d0 100644 (file)
 
 #include <glib.h>
 
+#define _GNU_SOURCE /* for asprintf */
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
 
+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)
 {