]> gitweb.ps.run Git - ps-cgit/commitdiff
Merge branch 'ml/head-include'
authorLars Hjemli <hjemli@gmail.com>
Sat, 25 Jul 2009 10:04:08 +0000 (12:04 +0200)
committerLars Hjemli <hjemli@gmail.com>
Sat, 25 Jul 2009 10:04:08 +0000 (12:04 +0200)
cgit.c
cgit.h
ui-atom.c
ui-blob.c
ui-plain.c
ui-shared.c
ui-shared.h

diff --git a/cgit.c b/cgit.c
index 2afc5988afa1261b3adacfd4d8c307838766c1cb..513ea125bb196a065a4b1cc24f24cae0f571de52 100644 (file)
--- 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 aed826afe589484ac60b7184460741c899eecbf7..78b30bace9327dc310dd646fa1ad86bdecd64ce6 100644 (file)
--- 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 {
index a6ea3eecf58ec6fd0db3aab018522ecca5e98acd..e5c31d9dd066fd7e7a63da846ab6add0b9aea0e6 100644 (file)
--- 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("</published>\n");
        if (host) {
-               html("<link rel='alternate' type='text/html' href='http://");
+               html("<link rel='alternate' type='text/html' href='");
+               html(cgit_httpscheme());
                html_attr(host);
                html_attr(cgit_pageurl(ctx.repo->url, "commit", NULL));
                if (ctx.cfg.virtual_root)
@@ -113,7 +114,8 @@ void cgit_print_atom(char *tip, char *path, int max_count)
        html_txt(ctx.repo->desc);
        html("</subtitle>\n");
        if (host) {
-               html("<link rel='alternate' type='text/html' href='http://");
+               html("<link rel='alternate' type='text/html' href='");
+               html(cgit_httpscheme());
                html_attr(host);
                html_attr(cgit_repourl(ctx.repo->url));
                html("'/>\n");
index 3cda03d37992e987a3000613b01d6d7ac325db18..2ccd31d2a19e5df1651cf2efff5952254cb3a0ad 100644 (file)
--- 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);
index 5addd9e686539ca41f264394ecf6836aa739af4e..93a3a05ac50f7a43b3c50529a011f0c9fdbf547c 100644 (file)
@@ -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;
index fea2c4054c736b53bf97f7dc735016e94663f0c4..66d5b8220de122d69a8398119592f09114c83731 100644 (file)
@@ -34,6 +34,17 @@ void cgit_print_error(char *msg)
        html("</div>\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("<link rel='alternate' title='Atom feed' href='http://");
+               html("<link rel='alternate' title='Atom feed' href='");
+               html(cgit_httpscheme());
                html_attr(cgit_hosturl());
                html_attr(cgit_fileurl(ctx->repo->url, "atom", ctx->qry.path,
                                       fmt("h=%s", ctx->qry.head)));
index 5a3821f20e1e973f1446845d2641f5e5bc13f5a1..bff482604428c201e3a3c4c2d07d2642923a23f3 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef UI_SHARED_H
 #define UI_SHARED_H
 
+extern char *cgit_httpscheme();
 extern char *cgit_hosturl();
 extern char *cgit_repourl(const char *reponame);
 extern char *cgit_fileurl(const char *reponame, const char *pagename,