summaryrefslogtreecommitdiffabout
Unidiff
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--cgit.c37
-rw-r--r--cgit.h14
-rw-r--r--ui-shared.c49
3 files changed, 62 insertions, 38 deletions
diff --git a/cgit.c b/cgit.c
index bf46b5a..66dd140 100644
--- a/cgit.c
+++ b/cgit.c
@@ -216,4 +216,9 @@ static void querystring_cb(const char *name, const char *value)
216} 216}
217 217
218char *xstrdupn(const char *str)
219{
220 return (str ? xstrdup(str) : NULL);
221}
222
218static void prepare_context(struct cgit_context *ctx) 223static void prepare_context(struct cgit_context *ctx)
219{ 224{
@@ -246,4 +251,14 @@ static void prepare_context(struct cgit_context *ctx)
246 ctx->cfg.summary_log = 10; 251 ctx->cfg.summary_log = 10;
247 ctx->cfg.summary_tags = 10; 252 ctx->cfg.summary_tags = 10;
253 ctx->env.cgit_config = xstrdupn(getenv("CGIT_CONFIG"));
254 ctx->env.http_host = xstrdupn(getenv("HTTP_HOST"));
255 ctx->env.https = xstrdupn(getenv("HTTPS"));
256 ctx->env.no_http = xstrdupn(getenv("NO_HTTP"));
257 ctx->env.path_info = xstrdupn(getenv("PATH_INFO"));
258 ctx->env.query_string = xstrdupn(getenv("QUERY_STRING"));
259 ctx->env.request_method = xstrdupn(getenv("REQUEST_METHOD"));
260 ctx->env.script_name = xstrdupn(getenv("SCRIPT_NAME"));
261 ctx->env.server_name = xstrdupn(getenv("SERVER_NAME"));
262 ctx->env.server_port = xstrdupn(getenv("SERVER_PORT"));
248 ctx->page.mimetype = "text/html"; 263 ctx->page.mimetype = "text/html";
249 ctx->page.charset = PAGE_ENCODING; 264 ctx->page.charset = PAGE_ENCODING;
@@ -254,4 +269,10 @@ static void prepare_context(struct cgit_context *ctx)
254 ctx->page.etag = NULL; 269 ctx->page.etag = NULL;
255 memset(&ctx->cfg.mimetypes, 0, sizeof(struct string_list)); 270 memset(&ctx->cfg.mimetypes, 0, sizeof(struct string_list));
271 if (ctx->env.script_name)
272 ctx->cfg.script_name = ctx->env.script_name;
273 if (ctx->env.query_string)
274 ctx->qry.raw = ctx->env.query_string;
275 if (!ctx->env.cgit_config)
276 ctx->env.cgit_config = CGIT_CONFIG;
256} 277}
257 278
@@ -426,4 +447,7 @@ static void cgit_parse_args(int argc, const char **argv)
426 ctx.cfg.nocache = 1; 447 ctx.cfg.nocache = 1;
427 } 448 }
449 if (!strcmp(argv[i], "--nohttp")) {
450 ctx.env.no_http = "1";
451 }
428 if (!strncmp(argv[i], "--query=", 8)) { 452 if (!strncmp(argv[i], "--query=", 8)) {
429 ctx.qry.raw = xstrdup(argv[i]+8); 453 ctx.qry.raw = xstrdup(argv[i]+8);
@@ -478,6 +502,4 @@ static int calc_ttl()
478int main(int argc, const char **argv) 502int main(int argc, const char **argv)
479{ 503{
480 const char *cgit_config_env = getenv("CGIT_CONFIG");
481 const char *method = getenv("REQUEST_METHOD");
482 const char *path; 504 const char *path;
483 char *qry; 505 char *qry;
@@ -489,11 +511,6 @@ int main(int argc, const char **argv)
489 cgit_repolist.repos = NULL; 511 cgit_repolist.repos = NULL;
490 512
491 if (getenv("SCRIPT_NAME"))
492 ctx.cfg.script_name = xstrdup(getenv("SCRIPT_NAME"));
493 if (getenv("QUERY_STRING"))
494 ctx.qry.raw = xstrdup(getenv("QUERY_STRING"));
495 cgit_parse_args(argc, argv); 513 cgit_parse_args(argc, argv);
496 parse_configfile(cgit_config_env ? cgit_config_env : CGIT_CONFIG, 514 parse_configfile(ctx.env.cgit_config, config_cb);
497 config_cb);
498 ctx.repo = NULL; 515 ctx.repo = NULL;
499 http_parse_querystring(ctx.qry.raw, querystring_cb); 516 http_parse_querystring(ctx.qry.raw, querystring_cb);
@@ -510,5 +527,5 @@ int main(int argc, const char **argv)
510 * long as PATH_INFO is included in the cache lookup key). 527 * long as PATH_INFO is included in the cache lookup key).
511 */ 528 */
512 path = getenv("PATH_INFO"); 529 path = ctx.env.path_info;
513 if (!ctx.qry.url && path) { 530 if (!ctx.qry.url && path) {
514 if (path[0] == '/') 531 if (path[0] == '/')
@@ -526,5 +543,5 @@ int main(int argc, const char **argv)
526 ttl = calc_ttl(); 543 ttl = calc_ttl();
527 ctx.page.expires += ttl*60; 544 ctx.page.expires += ttl*60;
528 if (method && !strcmp(method, "HEAD")) 545 if (ctx.env.request_method && !strcmp(ctx.env.request_method, "HEAD"))
529 ctx.cfg.nocache = 1; 546 ctx.cfg.nocache = 1;
530 if (ctx.cfg.nocache) 547 if (ctx.cfg.nocache)
diff --git a/cgit.h b/cgit.h
index 4c854ea..d90ccdc 100644
--- a/cgit.h
+++ b/cgit.h
@@ -208,5 +208,19 @@ struct cgit_page {
208}; 208};
209 209
210struct cgit_environment {
211 char *cgit_config;
212 char *http_host;
213 char *https;
214 char *no_http;
215 char *path_info;
216 char *query_string;
217 char *request_method;
218 char *script_name;
219 char *server_name;
220 char *server_port;
221};
222
210struct cgit_context { 223struct cgit_context {
224 struct cgit_environment env;
211 struct cgit_query qry; 225 struct cgit_query qry;
212 struct cgit_config cfg; 226 struct cgit_config cfg;
diff --git a/ui-shared.c b/ui-shared.c
index 015c52b..cf06511 100644
--- a/ui-shared.c
+++ b/ui-shared.c
@@ -37,8 +37,5 @@ void cgit_print_error(char *msg)
37char *cgit_httpscheme() 37char *cgit_httpscheme()
38{ 38{
39 char *https; 39 if (ctx.env.https && !strcmp(ctx.env.https, "on"))
40
41 https = getenv("HTTPS");
42 if (https != NULL && strcmp(https, "on") == 0)
43 return "https://"; 40 return "https://";
44 else 41 else
@@ -48,20 +45,11 @@ char *cgit_httpscheme()
48char *cgit_hosturl() 45char *cgit_hosturl()
49{ 46{
50 char *host, *port; 47 if (ctx.env.http_host)
51 48 return ctx.env.http_host;
52 host = getenv("HTTP_HOST"); 49 if (!ctx.env.server_name)
53 if (host) {
54 host = xstrdup(host);
55 } else {
56 host = getenv("SERVER_NAME");
57 if (!host)
58 return NULL; 50 return NULL;
59 port = getenv("SERVER_PORT"); 51 if (!ctx.env.server_port || atoi(ctx.env.server_port) == 80)
60 if (port && atoi(port) != 80) 52 return ctx.env.server_name;
61 host = xstrdup(fmt("%s:%d", host, atoi(port))); 53 return xstrdup(fmt("%s:%s", ctx.env.server_name, ctx.env.server_port));
62 else
63 host = xstrdup(host);
64 }
65 return host;
66} 54}
67 55
@@ -468,7 +456,5 @@ void cgit_print_age(time_t t, time_t max_relative, char *format)
468void cgit_print_http_headers(struct cgit_context *ctx) 456void cgit_print_http_headers(struct cgit_context *ctx)
469{ 457{
470 const char *method = getenv("REQUEST_METHOD"); 458 if (ctx->env.no_http && !strcmp(ctx->env.no_http, "1"))
471
472 if (ctx->cfg.embedded)
473 return; 459 return;
474 460
@@ -490,5 +476,5 @@ void cgit_print_http_headers(struct cgit_context *ctx)
490 htmlf("ETag: \"%s\"\n", ctx->page.etag); 476 htmlf("ETag: \"%s\"\n", ctx->page.etag);
491 html("\n"); 477 html("\n");
492 if (method && !strcmp(method, "HEAD")) 478 if (ctx->env.request_method && !strcmp(ctx->env.request_method, "HEAD"))
493 exit(0); 479 exit(0);
494} 480}
@@ -496,6 +482,9 @@ void cgit_print_http_headers(struct cgit_context *ctx)
496void cgit_print_docstart(struct cgit_context *ctx) 482void cgit_print_docstart(struct cgit_context *ctx)
497{ 483{
498 if (ctx->cfg.embedded) 484 if (ctx->cfg.embedded) {
485 if (ctx->cfg.header)
486 html_include(ctx->cfg.header);
499 return; 487 return;
488 }
500 489
501 char *host = cgit_hosturl(); 490 char *host = cgit_hosturl();
@@ -535,5 +524,11 @@ void cgit_print_docstart(struct cgit_context *ctx)
535void cgit_print_docend() 524void cgit_print_docend()
536{ 525{
537 html("</div>"); 526 html("</div> <!-- class=content -->\n");
527 if (ctx.cfg.embedded) {
528 html("</div> <!-- id=cgit -->\n");
529 if (ctx.cfg.footer)
530 html_include(ctx.cfg.footer);
531 return;
532 }
538 if (ctx.cfg.footer) 533 if (ctx.cfg.footer)
539 html_include(ctx.cfg.footer); 534 html_include(ctx.cfg.footer);
@@ -544,7 +539,5 @@ void cgit_print_docend()
544 html("</div>\n"); 539 html("</div>\n");
545 } 540 }
546 html("</div>"); 541 html("</div> <!-- id=cgit -->\n");
547 if (ctx.cfg.embedded)
548 return;
549 html("</body>\n</html>\n"); 542 html("</body>\n</html>\n");
550} 543}