From: Thadeu Lima de Souza Cascardo Date: Sat, 11 Oct 2008 22:39:50 +0000 (-0300) Subject: Get Base URL from HTTP Headers X-Git-Url: http://git.cascardo.eti.br/?p=cascardo%2Fatompub.git;a=commitdiff_plain;h=66c442f8a3717c265e7d41185b490aed0beedb9c Get Base URL from HTTP Headers --- diff --git a/frontend/cgi/cgi.c b/frontend/cgi/cgi.c index 9338f4d..9b1b8d0 100644 --- a/frontend/cgi/cgi.c +++ b/frontend/cgi/cgi.c @@ -21,11 +21,66 @@ #include +#define _GNU_SOURCE /* for asprintf */ #include #include #include #include +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) {