diff options
-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
diff --git a/cgit.c b/cgit.c index f6bb0c7..aa1107a 100644 --- a/cgit.c +++ b/cgit.c | |||
@@ -17,6 +17,14 @@ | |||
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")) |
@@ -103,6 +111,8 @@ void config_cb(const char *name, const char *value) | |||
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")) |
@@ -215,6 +225,7 @@ static void prepare_context(struct cgit_context *ctx) | |||
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 { |
diff --git a/cgit.h b/cgit.h index acb5e8f..1194eb0 100644 --- a/cgit.h +++ b/cgit.h | |||
@@ -15,6 +15,7 @@ | |||
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> |
@@ -175,6 +176,7 @@ struct cgit_config { | |||
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 { |
diff --git a/cgitrc.5.txt b/cgitrc.5.txt index 7754923..0412f64 100644 --- a/cgitrc.5.txt +++ b/cgitrc.5.txt | |||
@@ -147,6 +147,10 @@ max-stats:: | |||
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 |
@@ -329,6 +333,19 @@ 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 |
diff --git a/ui-plain.c b/ui-plain.c index 93a3a05..27c6dae 100644 --- a/ui-plain.c +++ b/ui-plain.c | |||
@@ -17,8 +17,9 @@ int match; | |||
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) { |
@@ -31,10 +32,19 @@ static void print_object(const unsigned char *sha1, const char *path) | |||
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); |