sort the MIME mappings and do a binary search to match

This commit is contained in:
Omar Polo 2022-04-08 15:14:09 +00:00
parent ca44613693
commit 18bd83915e
3 changed files with 29 additions and 4 deletions

1
gmid.c
View File

@ -253,6 +253,7 @@ listener_main(struct imsgbuf *ibuf)
drop_priv();
if (!conf.mime.skip_defaults && load_default_mime(&conf.mime) == -1)
fatal("load_default_mime: %s", strerror(errno));
sort_mime(&conf.mime);
load_vhosts();
loop(ctx, sock4, sock6, ibuf);
return 0;

1
gmid.h
View File

@ -362,6 +362,7 @@ int logger_main(int, struct imsgbuf*);
void init_mime(struct mime*);
int add_mime(struct mime*, const char*, const char*);
int load_default_mime(struct mime*);
void sort_mime(struct mime *);
const char *mime(struct vhost*, const char*);
void free_mime(struct mime *);

31
mime.c
View File

@ -111,6 +111,29 @@ path_ext(const char *path)
return NULL;
}
static int
mime_comp(const void *a, const void *b)
{
const struct etm *x = a, *y = b;
return strcmp(x->ext, y->ext);
}
void
sort_mime(struct mime *m)
{
qsort(m->t, m->len, sizeof(*m->t), mime_comp);
}
static int
mime_find(const void *a, const void *b)
{
const char *ext = a;
const struct etm *x = b;
return strcmp(ext, x->ext);
}
const char *
mime(struct vhost *host, const char *path)
{
@ -122,10 +145,10 @@ mime(struct vhost *host, const char *path)
if ((ext = path_ext(path)) == NULL)
return def;
for (t = conf.mime.t; t->mime != NULL; ++t)
if (!strcmp(ext, t->ext))
return t->mime;
t = bsearch(ext, conf.mime.t, conf.mime.len, sizeof(*conf.mime.t),
mime_find);
if (t != NULL)
return t->mime;
return def;
}