diff options
Diffstat (limited to 'ui-shared.c')
| -rw-r--r-- | ui-shared.c | 81 | 
1 files changed, 56 insertions, 25 deletions
| diff --git a/ui-shared.c b/ui-shared.c index 40060ba..07d5dd4 100644 --- a/ui-shared.c +++ b/ui-shared.c @@ -34,24 +34,23 @@ void cgit_print_error(char *msg)  	html("</div>\n");  } -char *cgit_hosturl() +char *cgit_httpscheme()  { -	char *host, *port; +	if (ctx.env.https && !strcmp(ctx.env.https, "on")) +		return "https://"; +	else +		return "http://"; +} -	host = getenv("HTTP_HOST"); -	if (host) { -		host = xstrdup(host); -	} else { -		host = getenv("SERVER_NAME"); -		if (!host) -			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; +char *cgit_hosturl() +{ +	if (ctx.env.http_host) +		return ctx.env.http_host; +	if (!ctx.env.server_name) +		return NULL; +	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));  }  char *cgit_rooturl() @@ -456,6 +455,11 @@ void cgit_print_age(time_t t, time_t max_relative, char *format)  void cgit_print_http_headers(struct cgit_context *ctx)  { +	if (ctx->env.no_http && !strcmp(ctx->env.no_http, "1")) +		return; + +	if (ctx->page.status) +		htmlf("Status: %d %s\n", ctx->page.status, ctx->page.statusmsg);  	if (ctx->page.mimetype && ctx->page.charset)  		htmlf("Content-Type: %s; charset=%s\n", ctx->page.mimetype,  		      ctx->page.charset); @@ -468,11 +472,21 @@ void cgit_print_http_headers(struct cgit_context *ctx)  		      ctx->page.filename);  	htmlf("Last-Modified: %s\n", http_date(ctx->page.modified));  	htmlf("Expires: %s\n", http_date(ctx->page.expires)); +	if (ctx->page.etag) +		htmlf("ETag: \"%s\"\n", ctx->page.etag);  	html("\n"); +	if (ctx->env.request_method && !strcmp(ctx->env.request_method, "HEAD")) +		exit(0);  }  void cgit_print_docstart(struct cgit_context *ctx)  { +	if (ctx->cfg.embedded) { +		if (ctx->cfg.header) +			html_include(ctx->cfg.header); +		return; +	} +  	char *host = cgit_hosturl();  	html(cgit_doctype);  	html("<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'>\n"); @@ -492,12 +506,15 @@ void cgit_print_docstart(struct cgit_context *ctx)  		html("'/>\n");  	}  	if (host && ctx->repo) { -		html("<link rel='alternate' title='Atom feed' href='http://"); +		html("<link rel='alternate' title='Atom feed' href='"); +		html(cgit_httpscheme());  		html_attr(cgit_hosturl());  		html_attr(cgit_fileurl(ctx->repo->url, "atom", ctx->qry.path,  				       fmt("h=%s", ctx->qry.head))); -		html("' type='application/atom+xml'/>"); +		html("' type='application/atom+xml'/>\n");  	} +	if (ctx->cfg.head_include) +		html_include(ctx->cfg.head_include);  	html("</head>\n");  	html("<body>\n");  	if (ctx->cfg.header) @@ -506,7 +523,13 @@ void cgit_print_docstart(struct cgit_context *ctx)  void cgit_print_docend()  { -	html("</div>"); +	html("</div> <!-- class=content -->\n"); +	if (ctx.cfg.embedded) { +		html("</div> <!-- id=cgit -->\n"); +		if (ctx.cfg.footer) +			html_include(ctx.cfg.footer); +		return; +	}  	if (ctx.cfg.footer)  		html_include(ctx.cfg.footer);  	else { @@ -515,6 +538,7 @@ void cgit_print_docend()  		cgit_print_date(time(NULL), FMT_LONGDATE, ctx.cfg.local_time);  		html("</div>\n");  	} +	html("</div> <!-- id=cgit -->\n");  	html("</body>\n</html>\n");  } @@ -602,13 +626,8 @@ char *hc(struct cgit_cmd *cmd, const char *page)  	return (strcmp(cmd ? cmd->name : fallback_cmd, page) ? NULL : "active");  } -void cgit_print_pageheader(struct cgit_context *ctx) +static void print_header(struct cgit_context *ctx)  { -	struct cgit_cmd *cmd = cgit_get_cmd(ctx); - -	if (!cmd && ctx->repo) -		fallback_cmd = "summary"; -  	html("<table id='header'>\n");  	html("<tr>\n"); @@ -652,6 +671,18 @@ void cgit_print_pageheader(struct cgit_context *ctx)  			html_include(ctx->cfg.index_info);  	}  	html("</td></tr></table>\n"); +} + +void cgit_print_pageheader(struct cgit_context *ctx) +{ +	struct cgit_cmd *cmd = cgit_get_cmd(ctx); + +	if (!cmd && ctx->repo) +		fallback_cmd = "summary"; + +	html("<div id='cgit'>"); +	if (!ctx->cfg.noheader) +		print_header(ctx);  	html("<table class='tabs'><tr><td>\n");  	if (ctx->repo) { | 
