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>
This commit is contained in:
Lars Hjemli 2009-02-19 22:38:36 +01:00
parent 6063e7b553
commit 488a214a81
4 changed files with 5 additions and 0 deletions

1
cgit.c
View File

@ -206,6 +206,7 @@ static void prepare_context(struct cgit_context *ctx)
ctx->page.size = 0; ctx->page.size = 0;
ctx->page.modified = time(NULL); ctx->page.modified = time(NULL);
ctx->page.expires = ctx->page.modified; ctx->page.expires = ctx->page.modified;
ctx->page.etag = NULL;
} }
struct refmatch { struct refmatch {

1
cgit.h
View File

@ -180,6 +180,7 @@ struct cgit_page {
char *mimetype; char *mimetype;
char *charset; char *charset;
char *filename; char *filename;
char *etag;
char *title; char *title;
}; };

View File

@ -34,6 +34,7 @@ static void print_object(const unsigned char *sha1, const char *path)
ctx.page.mimetype = "text/plain"; ctx.page.mimetype = "text/plain";
ctx.page.filename = fmt("%s", path); ctx.page.filename = fmt("%s", path);
ctx.page.size = size; ctx.page.size = size;
ctx.page.etag = sha1_to_hex(sha1);
cgit_print_http_headers(&ctx); cgit_print_http_headers(&ctx);
html_raw(buf, size); html_raw(buf, size);
match = 1; match = 1;

View File

@ -468,6 +468,8 @@ void cgit_print_http_headers(struct cgit_context *ctx)
ctx->page.filename); ctx->page.filename);
htmlf("Last-Modified: %s\n", http_date(ctx->page.modified)); htmlf("Last-Modified: %s\n", http_date(ctx->page.modified));
htmlf("Expires: %s\n", http_date(ctx->page.expires)); htmlf("Expires: %s\n", http_date(ctx->page.expires));
if (ctx->page.etag)
htmlf("ETag: \"%s\"\n", ctx->page.etag);
html("\n"); html("\n");
} }