From c730da1fc8860fb582a7ca4b6a28428036a9b222 Mon Sep 17 00:00:00 2001 From: Andrea Zagli Date: Wed, 29 Jul 2015 16:12:41 +0200 Subject: [PATCH] Redirect now works with relative urls (not with domain) (closes #942). --- src/main.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++-- src/main.h | 2 +- tests/redirect.c | 9 ++++---- 3 files changed, 57 insertions(+), 8 deletions(-) diff --git a/src/main.c b/src/main.c index 23f554f..75a6f05 100644 --- a/src/main.c +++ b/src/main.c @@ -806,12 +806,62 @@ GHashTable } void -zak_cgi_main_redirect (const gchar *url) +zak_cgi_main_redirect (ZakCgiMain *zakcgimain, const gchar *url) { + GString *_url; + GHashTable *ht_env; + gchar *value; + GRegex *regex; + + _url = g_string_new (""); + if (!g_str_has_prefix (url, "http://") + && !g_str_has_prefix (url, "https://") + && !g_str_has_prefix (url, "ftp://")) + { + ht_env = zak_cgi_main_get_env (zakcgimain); + + value = (gchar *)g_hash_table_lookup (ht_env, "REQUEST_SCHEME"); + if (value != NULL) + { + g_string_append_printf (_url, "%s://", value); + } + + value = (gchar *)g_hash_table_lookup (ht_env, "SERVER_NAME"); + if (value != NULL) + { + if (!g_str_has_prefix (url, value)) + { + g_string_append_printf (_url, value); + } + } + + if (!g_str_has_prefix (url, "/")) + { + /* TODO + * test if it starts with a domain, ex: www.google.it */ + value = (gchar *)g_hash_table_lookup (ht_env, "CONTEXT_PREFIX"); + if (value != NULL) + { + if (!g_str_has_prefix (url, value)) + { + g_string_append_printf (_url, value); + } + } + } + + g_string_append_printf (_url, url); + } + else + { + g_string_assign (_url, url); + } + g_printf ("%s%s%c%c\n", "Location: ", - url, + _url->str, 13, 10); + + g_string_free (_url, TRUE); } gboolean diff --git a/src/main.h b/src/main.h index aa15756..1ad3a6e 100644 --- a/src/main.h +++ b/src/main.h @@ -91,7 +91,7 @@ gchar *zak_cgi_main_get_stdin (ZakCgiMain *zakcgimain); GHashTable *zak_cgi_main_parse_stdin (const gchar *buf, const gchar *boundary); -void zak_cgi_main_redirect (const gchar *url); +void zak_cgi_main_redirect (ZakCgiMain *zakcgimain, const gchar *url); gboolean zak_cgi_main_is_request_method (ZakCgiMain *zakcgimain, const gchar *method); diff --git a/tests/redirect.c b/tests/redirect.c index bdc0f19..2069d8b 100644 --- a/tests/redirect.c +++ b/tests/redirect.c @@ -21,14 +21,13 @@ int main (int argc, char *argv[]) { + ZakCgiMain *zakcgi_main; GHashTable *ht_env; - ht_env = zak_cgi_main_get_parameters (NULL, NULL); + zakcgi_main = zak_cgi_main_new (); + ht_env = zak_cgi_main_get_parameters (zakcgi_main, NULL); - zak_cgi_main_redirect ((gchar *)g_value_get_string ((GValue *)(const gchar *)g_hash_table_lookup (ht_env, "redirectto"))); - - g_hash_table_destroy (ht_env); + zak_cgi_main_redirect (zakcgi_main, (gchar *)g_value_get_string ((GValue *)(const gchar *)g_hash_table_lookup (ht_env, "redirectto"))); return 0; } - -- 2.49.0