summaryrefslogtreecommitdiffabout
Side-by-side diff
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--cgit.c33
-rw-r--r--cgit.h13
-rw-r--r--ui-shared.c30
3 files changed, 44 insertions, 32 deletions
diff --git a/cgit.c b/cgit.c
index 7b228af..a92383d 100644
--- a/cgit.c
+++ b/cgit.c
@@ -217,2 +217,7 @@ static void querystring_cb(const char *name, const char *value)
+char *xstrdupn(const char *str)
+{
+ return (str ? xstrdup(str) : NULL);
+}
+
static void prepare_context(struct cgit_context *ctx)
@@ -247,2 +252,11 @@ static void prepare_context(struct cgit_context *ctx)
ctx->cfg.summary_tags = 10;
+ ctx->env.cgit_config = xstrdupn(getenv("CGIT_CONFIG"));
+ ctx->env.http_host = xstrdupn(getenv("HTTP_HOST"));
+ ctx->env.https = xstrdupn(getenv("HTTPS"));
+ ctx->env.path_info = xstrdupn(getenv("PATH_INFO"));
+ ctx->env.query_string = xstrdupn(getenv("QUERY_STRING"));
+ ctx->env.request_method = xstrdupn(getenv("REQUEST_METHOD"));
+ ctx->env.script_name = xstrdupn(getenv("SCRIPT_NAME"));
+ ctx->env.server_name = xstrdupn(getenv("SERVER_NAME"));
+ ctx->env.server_port = xstrdupn(getenv("SERVER_PORT"));
ctx->page.mimetype = "text/html";
@@ -255,2 +269,8 @@ static void prepare_context(struct cgit_context *ctx)
memset(&ctx->cfg.mimetypes, 0, sizeof(struct string_list));
+ if (ctx->env.script_name)
+ ctx->cfg.script_name = ctx->env.script_name;
+ if (ctx->env.query_string)
+ ctx->qry.raw = ctx->env.query_string;
+ if (!ctx->env.cgit_config)
+ ctx->env.cgit_config = CGIT_CONFIG;
}
@@ -479,4 +499,2 @@ int main(int argc, const char **argv)
{
- const char *cgit_config_env = getenv("CGIT_CONFIG");
- const char *method = getenv("REQUEST_METHOD");
const char *path;
@@ -490,9 +508,4 @@ int main(int argc, const char **argv)
- if (getenv("SCRIPT_NAME"))
- ctx.cfg.script_name = xstrdup(getenv("SCRIPT_NAME"));
- if (getenv("QUERY_STRING"))
- ctx.qry.raw = xstrdup(getenv("QUERY_STRING"));
cgit_parse_args(argc, argv);
- parse_configfile(cgit_config_env ? cgit_config_env : CGIT_CONFIG,
- config_cb);
+ parse_configfile(ctx.env.cgit_config, config_cb);
ctx.repo = NULL;
@@ -511,3 +524,3 @@ int main(int argc, const char **argv)
*/
- path = getenv("PATH_INFO");
+ path = ctx.env.path_info;
if (!ctx.qry.url && path) {
@@ -527,3 +540,3 @@ int main(int argc, const char **argv)
ctx.page.expires += ttl*60;
- if (method && !strcmp(method, "HEAD"))
+ if (ctx.env.request_method && !strcmp(ctx.env.request_method, "HEAD"))
ctx.cfg.nocache = 1;
diff --git a/cgit.h b/cgit.h
index 4c854ea..893231d 100644
--- a/cgit.h
+++ b/cgit.h
@@ -209,3 +209,16 @@ struct cgit_page {
+struct cgit_environment {
+ char *cgit_config;
+ char *http_host;
+ char *https;
+ char *path_info;
+ char *query_string;
+ char *request_method;
+ char *script_name;
+ char *server_name;
+ char *server_port;
+};
+
struct cgit_context {
+ struct cgit_environment env;
struct cgit_query qry;
diff --git a/ui-shared.c b/ui-shared.c
index 015c52b..538ddda 100644
--- a/ui-shared.c
+++ b/ui-shared.c
@@ -38,6 +38,3 @@ char *cgit_httpscheme()
{
- char *https;
-
- https = getenv("HTTPS");
- if (https != NULL && strcmp(https, "on") == 0)
+ if (ctx.env.https && !strcmp(ctx.env.https, "on"))
return "https://";
@@ -49,18 +46,9 @@ char *cgit_hosturl()
{
- char *host, *port;
-
- host = getenv("HTTP_HOST");
- if (host) {
- host = xstrdup(host);
- } else {
- host = getenv("SERVER_NAME");
- if (!host)
+ if (ctx.env.http_host)
+ return ctx.env.http_host;
+ if (!ctx.env.server_name)
return NULL;
- port = getenv("SERVER_PORT");
- if (port && atoi(port) != 80)
- host = xstrdup(fmt("%s:%d", host, atoi(port)));
- else
- host = xstrdup(host);
- }
- return host;
+ if (!ctx.env.server_port || atoi(ctx.env.server_port) == 80)
+ return ctx.env.server_name;
+ return xstrdup(fmt("%s:%s", ctx.env.server_name, ctx.env.server_port));
}
@@ -469,4 +457,2 @@ void cgit_print_http_headers(struct cgit_context *ctx)
{
- const char *method = getenv("REQUEST_METHOD");
-
if (ctx->cfg.embedded)
@@ -491,3 +477,3 @@ void cgit_print_http_headers(struct cgit_context *ctx)
html("\n");
- if (method && !strcmp(method, "HEAD"))
+ if (ctx->env.request_method && !strcmp(ctx->env.request_method, "HEAD"))
exit(0);