Add support for ETag in 'plain' view
When downloading a blob identified by its path, the client might want to know if the blob has been modified since a previous download of the same path. To this end, an ETag containing the blob SHA1 seems to be ideal. Todo: add support for HEAD requests... Suggested-by: Owen Taylor <otaylor@redhat.com> Signed-off-by: Lars Hjemli <hjemli@gmail.com>
此提交包含在:
		
							
								
								
									
										1
									
								
								cgit.c
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								cgit.c
									
									
									
									
									
								
							| @@ -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 { | ||||
|   | ||||
							
								
								
									
										1
									
								
								cgit.h
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								cgit.h
									
									
									
									
									
								
							| @@ -180,6 +180,7 @@ struct cgit_page { | ||||
| 	char *mimetype; | ||||
| 	char *charset; | ||||
| 	char *filename; | ||||
| 	char *etag; | ||||
| 	char *title; | ||||
| }; | ||||
|  | ||||
|   | ||||
| @@ -34,6 +34,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; | ||||
|   | ||||
| @@ -468,6 +468,8 @@ 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"); | ||||
| } | ||||
|  | ||||
|   | ||||
		新增問題並參考
	
	封鎖使用者
	 Lars Hjemli
					Lars Hjemli