From: Lars Hjemli Date: Sat, 25 Jul 2009 10:04:08 +0000 (+0200) Subject: Merge branch 'ml/head-include' X-Git-Url: https://gitweb.ps.run/ps-cgit/commitdiff_plain/542f6a433034935a1aa895f7ef3273968915a5d1?hp=f618e8f7174011e1e793df2c67fb9d1341652054 Merge branch 'ml/head-include' --- diff --git a/cgit.c b/cgit.c index 2afc598..513ea12 100644 --- a/cgit.c +++ b/cgit.c @@ -208,6 +208,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 { @@ -287,6 +288,8 @@ static int prepare_repo_cmd(struct cgit_context *ctx) if (get_sha1(ctx->qry.head, sha1)) { tmp = xstrdup(ctx->qry.head); ctx->qry.head = ctx->repo->defbranch; + ctx->page.status = 404; + ctx->page.statusmsg = "not found"; cgit_print_http_headers(ctx); cgit_print_docstart(ctx); cgit_print_pageheader(ctx); @@ -431,6 +434,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 +481,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, diff --git a/cgit.h b/cgit.h index aed826a..78b30ba 100644 --- a/cgit.h +++ b/cgit.h @@ -181,7 +181,10 @@ struct cgit_page { char *mimetype; char *charset; char *filename; + char *etag; char *title; + int status; + char *statusmsg; }; struct cgit_context { diff --git a/ui-atom.c b/ui-atom.c index a6ea3ee..e5c31d9 100644 --- a/ui-atom.c +++ b/ui-atom.c @@ -52,7 +52,8 @@ void add_entry(struct commit *commit, char *host) cgit_print_date(info->author_date, FMT_ATOMDATE, ctx.cfg.local_time); html("\n"); if (host) { - html("\n"); diff --git a/ui-blob.c b/ui-blob.c index 3cda03d..2ccd31d 100644 --- a/ui-blob.c +++ b/ui-blob.c @@ -27,7 +27,7 @@ void cgit_print_blob(const char *hex, char *path, const char *head) unsigned char sha1[20]; enum object_type type; - unsigned char *buf; + char *buf; unsigned long size; struct commit *commit; const char *paths[] = {path, NULL}; @@ -67,6 +67,12 @@ void cgit_print_blob(const char *hex, char *path, const char *head) buf[size] = '\0'; ctx.page.mimetype = ctx.qry.mimetype; + if (!ctx.page.mimetype) { + if (buffer_is_binary(buf, size)) + ctx.page.mimetype = "application/octet-stream"; + else + ctx.page.mimetype = "text/plain"; + } ctx.page.filename = path; cgit_print_http_headers(&ctx); write(htmlfd, buf, size); diff --git a/ui-plain.c b/ui-plain.c index 5addd9e..93a3a05 100644 --- a/ui-plain.c +++ b/ui-plain.c @@ -31,9 +31,13 @@ static void print_object(const unsigned char *sha1, const char *path) html_status(404, "Not found", 0); return; } - ctx.page.mimetype = "text/plain"; + if (buffer_is_binary(buf, size)) + ctx.page.mimetype = "application/octet-stream"; + else + 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 fea2c40..66d5b82 100644 --- a/ui-shared.c +++ b/ui-shared.c @@ -34,6 +34,17 @@ void cgit_print_error(char *msg) html("\n"); } +char *cgit_httpscheme() +{ + char *https; + + https = getenv("HTTPS"); + if (https != NULL && strcmp(https, "on") == 0) + return "https://"; + else + return "http://"; +} + char *cgit_hosturl() { char *host, *port; @@ -456,6 +467,10 @@ 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) htmlf("Content-Type: %s; charset=%s\n", ctx->page.mimetype, ctx->page.charset); @@ -468,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) @@ -492,7 +511,8 @@ void cgit_print_docstart(struct cgit_context *ctx) html("'/>\n"); } if (host && ctx->repo) { - html("