-rw-r--r-- | cgit.c | 11 | ||||
-rw-r--r-- | cgit.h | 2 | ||||
-rw-r--r-- | cgitrc.5.txt | 17 | ||||
-rw-r--r-- | ui-plain.c | 20 |
4 files changed, 45 insertions, 5 deletions
@@ -19,2 +19,10 @@ const char *cgit_version = CGIT_VERSION; +void add_mimetype(const char *name, const char *value) +{ + struct string_list_item *item; + + item = string_list_insert(xstrdup(name), &ctx.cfg.mimetypes); + item->util = xstrdup(value); +} + void config_cb(const char *name, const char *value) @@ -105,2 +113,4 @@ void config_cb(const char *name, const char *value) ctx.cfg.local_time = atoi(value); + else if (!prefixcmp(name, "mimetype.")) + add_mimetype(name + 9, value); else if (!strcmp(name, "repo.group")) @@ -217,2 +227,3 @@ static void prepare_context(struct cgit_context *ctx) ctx->page.etag = NULL; + memset(&ctx->cfg.mimetypes, 0, sizeof(struct string_list)); } @@ -17,2 +17,3 @@ #include <archive.h> +#include <string-list.h> #include <xdiff-interface.h> @@ -177,2 +178,3 @@ struct cgit_config { int summary_tags; + struct string_list mimetypes; }; diff --git a/cgitrc.5.txt b/cgitrc.5.txt index 7754923..0412f64 100644 --- a/cgitrc.5.txt +++ b/cgitrc.5.txt @@ -149,2 +149,6 @@ max-stats:: +mimetype.<ext>:: + Set the mimetype for the specified filename extension. This is used + by the `plain` command when returning blob content. + module-link:: @@ -331,2 +335,15 @@ snapshots=tar.gz tar.bz2 zip ## +## List of common mimetypes +## + +mimetype.git=image/git +mimetype.html=text/html +mimetype.jpg=image/jpeg +mimetype.jpeg=image/jpeg +mimetype.pdf=application/pdf +mimetype.png=image/png +mimetype.svg=image/svg+xml + + +## ## List of repositories. @@ -19,4 +19,5 @@ static void print_object(const unsigned char *sha1, const char *path) enum object_type type; - char *buf; + char *buf, *ext; unsigned long size; + struct string_list_item *mime; @@ -33,6 +34,15 @@ static void print_object(const unsigned char *sha1, const char *path) } - if (buffer_is_binary(buf, size)) - ctx.page.mimetype = "application/octet-stream"; - else - ctx.page.mimetype = "text/plain"; + ctx.page.mimetype = NULL; + ext = strrchr(path, '.'); + if (ext && *(++ext)) { + mime = string_list_lookup(ext, &ctx.cfg.mimetypes); + if (mime) + ctx.page.mimetype = (char *)mime->util; + } + 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 = fmt("%s", path); |