-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
@@ -16,8 +16,16 @@ | |||
16 | #include "scan-tree.h" | 16 | #include "scan-tree.h" |
17 | 17 | ||
18 | const char *cgit_version = CGIT_VERSION; | 18 | const char *cgit_version = CGIT_VERSION; |
19 | 19 | ||
20 | void add_mimetype(const char *name, const char *value) | ||
21 | { | ||
22 | struct string_list_item *item; | ||
23 | |||
24 | item = string_list_insert(xstrdup(name), &ctx.cfg.mimetypes); | ||
25 | item->util = xstrdup(value); | ||
26 | } | ||
27 | |||
20 | void config_cb(const char *name, const char *value) | 28 | void config_cb(const char *name, const char *value) |
21 | { | 29 | { |
22 | if (!strcmp(name, "root-title")) | 30 | if (!strcmp(name, "root-title")) |
23 | ctx.cfg.root_title = xstrdup(value); | 31 | ctx.cfg.root_title = xstrdup(value); |
@@ -102,8 +110,10 @@ void config_cb(const char *name, const char *value) | |||
102 | else if (!strcmp(name, "clone-prefix")) | 110 | else if (!strcmp(name, "clone-prefix")) |
103 | ctx.cfg.clone_prefix = xstrdup(value); | 111 | ctx.cfg.clone_prefix = xstrdup(value); |
104 | else if (!strcmp(name, "local-time")) | 112 | else if (!strcmp(name, "local-time")) |
105 | ctx.cfg.local_time = atoi(value); | 113 | ctx.cfg.local_time = atoi(value); |
114 | else if (!prefixcmp(name, "mimetype.")) | ||
115 | add_mimetype(name + 9, value); | ||
106 | else if (!strcmp(name, "repo.group")) | 116 | else if (!strcmp(name, "repo.group")) |
107 | ctx.cfg.repo_group = xstrdup(value); | 117 | ctx.cfg.repo_group = xstrdup(value); |
108 | else if (!strcmp(name, "repo.url")) | 118 | else if (!strcmp(name, "repo.url")) |
109 | ctx.repo = cgit_add_repo(value); | 119 | ctx.repo = cgit_add_repo(value); |
@@ -214,8 +224,9 @@ static void prepare_context(struct cgit_context *ctx) | |||
214 | ctx->page.size = 0; | 224 | ctx->page.size = 0; |
215 | ctx->page.modified = time(NULL); | 225 | ctx->page.modified = time(NULL); |
216 | ctx->page.expires = ctx->page.modified; | 226 | ctx->page.expires = ctx->page.modified; |
217 | ctx->page.etag = NULL; | 227 | ctx->page.etag = NULL; |
228 | memset(&ctx->cfg.mimetypes, 0, sizeof(struct string_list)); | ||
218 | } | 229 | } |
219 | 230 | ||
220 | struct refmatch { | 231 | struct refmatch { |
221 | char *req_ref; | 232 | char *req_ref; |
@@ -14,8 +14,9 @@ | |||
14 | #include <refs.h> | 14 | #include <refs.h> |
15 | #include <revision.h> | 15 | #include <revision.h> |
16 | #include <log-tree.h> | 16 | #include <log-tree.h> |
17 | #include <archive.h> | 17 | #include <archive.h> |
18 | #include <string-list.h> | ||
18 | #include <xdiff-interface.h> | 19 | #include <xdiff-interface.h> |
19 | #include <xdiff/xdiff.h> | 20 | #include <xdiff/xdiff.h> |
20 | #include <utf8.h> | 21 | #include <utf8.h> |
21 | 22 | ||
@@ -174,8 +175,9 @@ struct cgit_config { | |||
174 | int snapshots; | 175 | int snapshots; |
175 | int summary_branches; | 176 | int summary_branches; |
176 | int summary_log; | 177 | int summary_log; |
177 | int summary_tags; | 178 | int summary_tags; |
179 | struct string_list mimetypes; | ||
178 | }; | 180 | }; |
179 | 181 | ||
180 | struct cgit_page { | 182 | struct cgit_page { |
181 | time_t modified; | 183 | time_t modified; |
diff --git a/cgitrc.5.txt b/cgitrc.5.txt index 7754923..0412f64 100644 --- a/cgitrc.5.txt +++ b/cgitrc.5.txt | |||
@@ -146,8 +146,12 @@ max-stats:: | |||
146 | Set the default maximum statistics period. Valid values are "week", | 146 | Set the default maximum statistics period. Valid values are "week", |
147 | "month", "quarter" and "year". If unspecified, statistics are | 147 | "month", "quarter" and "year". If unspecified, statistics are |
148 | disabled. Default value: none. See also: "repo.max-stats". | 148 | disabled. Default value: none. See also: "repo.max-stats". |
149 | 149 | ||
150 | mimetype.<ext>:: | ||
151 | Set the mimetype for the specified filename extension. This is used | ||
152 | by the `plain` command when returning blob content. | ||
153 | |||
150 | module-link:: | 154 | module-link:: |
151 | Text which will be used as the formatstring for a hyperlink when a | 155 | Text which will be used as the formatstring for a hyperlink when a |
152 | submodule is printed in a directory listing. The arguments for the | 156 | submodule is printed in a directory listing. The arguments for the |
153 | formatstring are the path and SHA1 of the submodule commit. Default | 157 | formatstring are the path and SHA1 of the submodule commit. Default |
@@ -328,8 +332,21 @@ root-readme=/var/www/htdocs/about.html | |||
328 | snapshots=tar.gz tar.bz2 zip | 332 | snapshots=tar.gz tar.bz2 zip |
329 | 333 | ||
330 | 334 | ||
331 | ## | 335 | ## |
336 | ## List of common mimetypes | ||
337 | ## | ||
338 | |||
339 | mimetype.git=image/git | ||
340 | mimetype.html=text/html | ||
341 | mimetype.jpg=image/jpeg | ||
342 | mimetype.jpeg=image/jpeg | ||
343 | mimetype.pdf=application/pdf | ||
344 | mimetype.png=image/png | ||
345 | mimetype.svg=image/svg+xml | ||
346 | |||
347 | |||
348 | ## | ||
332 | ## List of repositories. | 349 | ## List of repositories. |
333 | ## PS: Any repositories listed when repo.group is unset will not be | 350 | ## PS: Any repositories listed when repo.group is unset will not be |
334 | ## displayed under a group heading | 351 | ## displayed under a group heading |
335 | ## PPS: This list could be kept in a different file (e.g. '/etc/cgitrepos') | 352 | ## PPS: This list could be kept in a different file (e.g. '/etc/cgitrepos') |
@@ -16,10 +16,11 @@ int match; | |||
16 | 16 | ||
17 | static void print_object(const unsigned char *sha1, const char *path) | 17 | static void print_object(const unsigned char *sha1, const char *path) |
18 | { | 18 | { |
19 | enum object_type type; | 19 | enum object_type type; |
20 | char *buf; | 20 | char *buf, *ext; |
21 | unsigned long size; | 21 | unsigned long size; |
22 | struct string_list_item *mime; | ||
22 | 23 | ||
23 | type = sha1_object_info(sha1, &size); | 24 | type = sha1_object_info(sha1, &size); |
24 | if (type == OBJ_BAD) { | 25 | if (type == OBJ_BAD) { |
25 | html_status(404, "Not found", 0); | 26 | html_status(404, "Not found", 0); |
@@ -30,12 +31,21 @@ static void print_object(const unsigned char *sha1, const char *path) | |||
30 | if (!buf) { | 31 | if (!buf) { |
31 | html_status(404, "Not found", 0); | 32 | html_status(404, "Not found", 0); |
32 | return; | 33 | return; |
33 | } | 34 | } |
34 | if (buffer_is_binary(buf, size)) | 35 | ctx.page.mimetype = NULL; |
35 | ctx.page.mimetype = "application/octet-stream"; | 36 | ext = strrchr(path, '.'); |
36 | else | 37 | if (ext && *(++ext)) { |
37 | ctx.page.mimetype = "text/plain"; | 38 | mime = string_list_lookup(ext, &ctx.cfg.mimetypes); |
39 | if (mime) | ||
40 | ctx.page.mimetype = (char *)mime->util; | ||
41 | } | ||
42 | if (!ctx.page.mimetype) { | ||
43 | if (buffer_is_binary(buf, size)) | ||
44 | ctx.page.mimetype = "application/octet-stream"; | ||
45 | else | ||
46 | ctx.page.mimetype = "text/plain"; | ||
47 | } | ||
38 | ctx.page.filename = fmt("%s", path); | 48 | ctx.page.filename = fmt("%s", path); |
39 | ctx.page.size = size; | 49 | ctx.page.size = size; |
40 | ctx.page.etag = sha1_to_hex(sha1); | 50 | ctx.page.etag = sha1_to_hex(sha1); |
41 | cgit_print_http_headers(&ctx); | 51 | cgit_print_http_headers(&ctx); |