diff options
| -rw-r--r-- | cgit.c | 4 | ||||
| -rw-r--r-- | cgit.h | 1 | ||||
| -rw-r--r-- | ui-plain.c | 1 | ||||
| -rw-r--r-- | ui-shared.c | 6 | 
4 files changed, 12 insertions, 0 deletions
| @@ -206,6 +206,7 @@ static void prepare_context(struct cgit_context *ctx)  	ctx->page.size = 0;  	ctx->page.modified = time(NULL);  	ctx->page.expires = ctx->page.modified; +	ctx->page.etag = NULL;  }  struct refmatch { @@ -431,6 +432,7 @@ static int calc_ttl()  int main(int argc, const char **argv)  {  	const char *cgit_config_env = getenv("CGIT_CONFIG"); +	const char *method = getenv("REQUEST_METHOD");  	const char *path;  	char *qry;  	int err, ttl; @@ -477,6 +479,8 @@ int main(int argc, const char **argv)  	ttl = calc_ttl();  	ctx.page.expires += ttl*60; +	if (method && !strcmp(method, "HEAD")) +		ctx.cfg.nocache = 1;  	if (ctx.cfg.nocache)  		ctx.cfg.cache_size = 0;  	err = cache_process(ctx.cfg.cache_size, ctx.cfg.cache_root, @@ -180,6 +180,7 @@ struct cgit_page {  	char *mimetype;  	char *charset;  	char *filename; +	char *etag;  	char *title;  	int status;  	char *statusmsg; @@ -37,6 +37,7 @@ static void print_object(const unsigned char *sha1, const char *path)  		ctx.page.mimetype = "text/plain";  	ctx.page.filename = fmt("%s", path);  	ctx.page.size = size; +	ctx.page.etag = sha1_to_hex(sha1);  	cgit_print_http_headers(&ctx);  	html_raw(buf, size);  	match = 1; diff --git a/ui-shared.c b/ui-shared.c index 29036d0..10be3c0 100644 --- a/ui-shared.c +++ b/ui-shared.c @@ -467,6 +467,8 @@ void cgit_print_age(time_t t, time_t max_relative, char *format)  void cgit_print_http_headers(struct cgit_context *ctx)  { +	const char *method = getenv("REQUEST_METHOD"); +  	if (ctx->page.status)  		htmlf("Status: %d %s\n", ctx->page.status, ctx->page.statusmsg);  	if (ctx->page.mimetype && ctx->page.charset) @@ -481,7 +483,11 @@ 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 (method && !strcmp(method, "HEAD")) +		exit(0);  }  void cgit_print_docstart(struct cgit_context *ctx) | 
