Merge branch 'lh/mimetypes'

This commit is contained in:
Lars Hjemli 2009-08-09 13:45:36 +02:00
commit 17e3ff4264
4 changed files with 45 additions and 5 deletions

11
cgit.c
View File

@ -17,6 +17,14 @@
const char *cgit_version = CGIT_VERSION; 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) void config_cb(const char *name, const char *value)
{ {
if (!strcmp(name, "root-title")) if (!strcmp(name, "root-title"))
@ -103,6 +111,8 @@ void config_cb(const char *name, const char *value)
ctx.cfg.clone_prefix = xstrdup(value); ctx.cfg.clone_prefix = xstrdup(value);
else if (!strcmp(name, "local-time")) else if (!strcmp(name, "local-time"))
ctx.cfg.local_time = atoi(value); ctx.cfg.local_time = atoi(value);
else if (!prefixcmp(name, "mimetype."))
add_mimetype(name + 9, value);
else if (!strcmp(name, "repo.group")) else if (!strcmp(name, "repo.group"))
ctx.cfg.repo_group = xstrdup(value); ctx.cfg.repo_group = xstrdup(value);
else if (!strcmp(name, "repo.url")) else if (!strcmp(name, "repo.url"))
@ -215,6 +225,7 @@ static void prepare_context(struct cgit_context *ctx)
ctx->page.modified = time(NULL); ctx->page.modified = time(NULL);
ctx->page.expires = ctx->page.modified; ctx->page.expires = ctx->page.modified;
ctx->page.etag = NULL; ctx->page.etag = NULL;
memset(&ctx->cfg.mimetypes, 0, sizeof(struct string_list));
} }
struct refmatch { struct refmatch {

2
cgit.h
View File

@ -15,6 +15,7 @@
#include <revision.h> #include <revision.h>
#include <log-tree.h> #include <log-tree.h>
#include <archive.h> #include <archive.h>
#include <string-list.h>
#include <xdiff-interface.h> #include <xdiff-interface.h>
#include <xdiff/xdiff.h> #include <xdiff/xdiff.h>
#include <utf8.h> #include <utf8.h>
@ -175,6 +176,7 @@ struct cgit_config {
int summary_branches; int summary_branches;
int summary_log; int summary_log;
int summary_tags; int summary_tags;
struct string_list mimetypes;
}; };
struct cgit_page { struct cgit_page {

View File

@ -147,6 +147,10 @@ max-stats::
"month", "quarter" and "year". If unspecified, statistics are "month", "quarter" and "year". If unspecified, statistics are
disabled. Default value: none. See also: "repo.max-stats". disabled. Default value: none. See also: "repo.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:: module-link::
Text which will be used as the formatstring for a hyperlink when a Text which will be used as the formatstring for a hyperlink when a
submodule is printed in a directory listing. The arguments for the submodule is printed in a directory listing. The arguments for the
@ -328,6 +332,19 @@ root-readme=/var/www/htdocs/about.html
snapshots=tar.gz tar.bz2 zip 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. ## List of repositories.
## PS: Any repositories listed when repo.group is unset will not be ## PS: Any repositories listed when repo.group is unset will not be

View File

@ -17,8 +17,9 @@ int match;
static void print_object(const unsigned char *sha1, const char *path) static void print_object(const unsigned char *sha1, const char *path)
{ {
enum object_type type; enum object_type type;
char *buf; char *buf, *ext;
unsigned long size; unsigned long size;
struct string_list_item *mime;
type = sha1_object_info(sha1, &size); type = sha1_object_info(sha1, &size);
if (type == OBJ_BAD) { if (type == OBJ_BAD) {
@ -31,10 +32,19 @@ static void print_object(const unsigned char *sha1, const char *path)
html_status(404, "Not found", 0); html_status(404, "Not found", 0);
return; return;
} }
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)) if (buffer_is_binary(buf, size))
ctx.page.mimetype = "application/octet-stream"; ctx.page.mimetype = "application/octet-stream";
else else
ctx.page.mimetype = "text/plain"; ctx.page.mimetype = "text/plain";
}
ctx.page.filename = fmt("%s", path); ctx.page.filename = fmt("%s", path);
ctx.page.size = size; ctx.page.size = size;
ctx.page.etag = sha1_to_hex(sha1); ctx.page.etag = sha1_to_hex(sha1);