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:
parent
6063e7b553
commit
488a214a81
1
cgit.c
1
cgit.c
@ -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
1
cgit.h
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user