summary refs log tree commit diff
path: root/ui-shared.c
diff options
context:
space:
mode:
Diffstat (limited to 'ui-shared.c')
-rw-r--r--ui-shared.c81
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) {