diff options
Diffstat (limited to 'src/reverse-proxy.c')
-rw-r--r-- | src/reverse-proxy.c | 212 |
1 files changed, 104 insertions, 108 deletions
diff --git a/src/reverse-proxy.c b/src/reverse-proxy.c index 8d97538..6afaab2 100644 --- a/src/reverse-proxy.c +++ b/src/reverse-proxy.c @@ -29,133 +29,129 @@ /* * Add entry to the reversepath list */ -void -reversepath_add (const char *path, const char *url) +void reversepath_add (const char *path, const char *url) { - struct reversepath *reverse; - - if (url == NULL) - { - log_message (LOG_WARNING, "Illegal reverse proxy rule: missing url"); - return; - } - - if (!strstr (url, "://")) - { - log_message (LOG_WARNING, - "Skipping reverse proxy rule: '%s' is not a valid url", - url); - return; - } - - if (path && *path != '/') - { - log_message (LOG_WARNING, - "Skipping reverse proxy rule: path '%s' " - "doesn't start with a /", path); - return; - } - - if (!(reverse = safemalloc (sizeof (struct reversepath)))) - { - log_message (LOG_ERR, "Unable to allocate memory in reversepath_add()"); - return; - } - - if (!path) - reverse->path = safestrdup ("/"); - else - reverse->path = safestrdup (path); - - reverse->url = safestrdup (url); - - reverse->next = config.reversepath_list; - config.reversepath_list = reverse; - - log_message (LOG_INFO, - "Added reverse proxy rule: %s -> %s", reverse->path, - reverse->url); + struct reversepath *reverse; + + if (url == NULL) { + log_message (LOG_WARNING, + "Illegal reverse proxy rule: missing url"); + return; + } + + if (!strstr (url, "://")) { + log_message (LOG_WARNING, + "Skipping reverse proxy rule: '%s' is not a valid url", + url); + return; + } + + if (path && *path != '/') { + log_message (LOG_WARNING, + "Skipping reverse proxy rule: path '%s' " + "doesn't start with a /", path); + return; + } + + if (!(reverse = safemalloc (sizeof (struct reversepath)))) { + log_message (LOG_ERR, + "Unable to allocate memory in reversepath_add()"); + return; + } + + if (!path) + reverse->path = safestrdup ("/"); + else + reverse->path = safestrdup (path); + + reverse->url = safestrdup (url); + + reverse->next = config.reversepath_list; + config.reversepath_list = reverse; + + log_message (LOG_INFO, + "Added reverse proxy rule: %s -> %s", reverse->path, + reverse->url); } /* * Check if a request url is in the reversepath list */ -struct reversepath * -reversepath_get (char *url) +struct reversepath *reversepath_get (char *url) { - struct reversepath *reverse = config.reversepath_list; + struct reversepath *reverse = config.reversepath_list; - while (reverse) - { - if (strstr (url, reverse->path) == url) - return reverse; + while (reverse) { + if (strstr (url, reverse->path) == url) + return reverse; - reverse = reverse->next; - } + reverse = reverse->next; + } - return NULL; + return NULL; } /* * Rewrite the URL for reverse proxying. */ -char * -reverse_rewrite_url (struct conn_s *connptr, hashmap_t hashofheaders, - char *url) +char *reverse_rewrite_url (struct conn_s *connptr, hashmap_t hashofheaders, + char *url) { - char *rewrite_url = NULL; - char *cookie = NULL; - char *cookieval; - struct reversepath *reverse; - - /* Reverse requests always start with a slash */ - if (*url == '/') - { - /* First try locating the reverse mapping by request url */ - reverse = reversepath_get (url); - if (reverse) - { - rewrite_url = safemalloc (strlen (url) + strlen (reverse->url) + 1); - strcpy (rewrite_url, reverse->url); - strcat (rewrite_url, url + strlen (reverse->path)); - } - else if (config.reversemagic - && hashmap_entry_by_key (hashofheaders, - "cookie", (void **) &cookie) > 0) - { - - /* No match - try the magical tracking cookie next */ - if ((cookieval = strstr (cookie, REVERSE_COOKIE "=")) - && (reverse = - reversepath_get (cookieval + strlen (REVERSE_COOKIE) + 1))) - { - - rewrite_url = safemalloc (strlen (url) + - strlen (reverse->url) + 1); - strcpy (rewrite_url, reverse->url); - strcat (rewrite_url, url + 1); - - log_message (LOG_INFO, - "Magical tracking cookie says: %s", reverse->path); - } + char *rewrite_url = NULL; + char *cookie = NULL; + char *cookieval; + struct reversepath *reverse; + + /* Reverse requests always start with a slash */ + if (*url == '/') { + /* First try locating the reverse mapping by request url */ + reverse = reversepath_get (url); + if (reverse) { + rewrite_url = + safemalloc (strlen (url) + strlen (reverse->url) + + 1); + strcpy (rewrite_url, reverse->url); + strcat (rewrite_url, url + strlen (reverse->path)); + } else if (config.reversemagic + && hashmap_entry_by_key (hashofheaders, + "cookie", + (void **) &cookie) > 0) { + + /* No match - try the magical tracking cookie next */ + if ((cookieval = strstr (cookie, REVERSE_COOKIE "=")) + && (reverse = + reversepath_get (cookieval + + strlen (REVERSE_COOKIE) + + 1))) { + + rewrite_url = safemalloc (strlen (url) + + strlen (reverse-> + url) + 1); + strcpy (rewrite_url, reverse->url); + strcat (rewrite_url, url + 1); + + log_message (LOG_INFO, + "Magical tracking cookie says: %s", + reverse->path); + } + } } - } - /* Forward proxy support off and no reverse path match found */ - if (config.reverseonly && !rewrite_url) - { - log_message (LOG_ERR, "Bad request"); - indicate_http_error (connptr, 400, "Bad Request", - "detail", - "Request has an invalid URL", "url", url, NULL); - return NULL; - } + /* Forward proxy support off and no reverse path match found */ + if (config.reverseonly && !rewrite_url) { + log_message (LOG_ERR, "Bad request"); + indicate_http_error (connptr, 400, "Bad Request", + "detail", + "Request has an invalid URL", "url", url, + NULL); + return NULL; + } - log_message (LOG_CONN, "Rewriting URL: %s -> %s", url, rewrite_url); + log_message (LOG_CONN, "Rewriting URL: %s -> %s", url, rewrite_url); - /* Store reverse path so that the magical tracking cookie can be set */ - if (config.reversemagic) - connptr->reversepath = safestrdup (reverse->path); + /* Store reverse path so that the magical tracking cookie can be set */ + if (config.reversemagic) + connptr->reversepath = safestrdup (reverse->path); - return rewrite_url; + return rewrite_url; } |