commit 982069a120a3d36483427ce00b9cf90a8bf4daab from: Omar Polo date: Mon Jan 18 18:43:47 2021 UTC add "mime" and "default type" option for the configuration commit - 0fbe79b33c1d16b0611851e2019558ce8888a02e commit + 982069a120a3d36483427ce00b9cf90a8bf4daab blob - 66563671a9a356f1a003553b406e077fad6a243b blob + bbf70d3ecdfc159c0d72c2c1b17c5accb675c43a --- gmid.h +++ gmid.h @@ -149,8 +149,10 @@ extern int yylex(void); /* mime.c */ void init_mime(void); +void set_default_mime(const char*); void add_mime(const char*, const char*); void load_default_mime(void); +int load_mime_file(const char*); const char *mime(const char*); /* server.c */ blob - 4b6cf8861dd89228e331af3446359bb2f581044e blob + cb6326a081556d03a109761b2a3902d32276a592 --- lex.l +++ lex.l @@ -55,6 +55,9 @@ daemon return TDAEMON; ipv6 return TIPV6; port return TPORT; protocols return TPROTOCOLS; +mime return TMIME; +default return TDEFAULT; +type return TTYPE; server return TSERVER; cert return TCERT; blob - cb2f28a0aca3a68bf5bb577ec0a74f86917effbb blob + 121dee05310d1f280333e947e2bdf0d219557119 --- mime.c +++ mime.c @@ -26,6 +26,7 @@ struct etm { /* extension to mime */ }; struct mimes { + char *def; struct etm *t; size_t len; size_t cap; @@ -41,8 +42,21 @@ init_mime(void) if ((mimes.t = calloc(mimes.cap, sizeof(struct etm))) == NULL) fatal("calloc: %s", strerror(errno)); + + mimes.def = strdup("application/octet-stream"); + if (mimes.def == NULL) + fatal("strdup: %s", strerror(errno)); + } +void +set_default_mime(const char *m) +{ + free(mimes.def); + if ((mimes.def = strdup(m)) == NULL) + fatal("strdup: %s", strerror(errno)); +} + /* register mime for the given extension */ void add_mime(const char *mime, const char *ext) @@ -102,15 +116,15 @@ path_ext(const char *path) const char * mime(const char *path) { - const char *ext, *def = "application/octet-stream"; + const char *ext; struct etm *t; if ((ext = path_ext(path)) == NULL) - return def; + return mimes.def; for (t = mimes.t; t->mime != NULL; ++t) if (!strcmp(ext, t->ext)) return t->mime; - return def; + return mimes.def; } blob - f4a21cf807184951e8422a78960ed5922a378350 blob + 286969ac678457a1abdd4c6abff0e4cb382a1ff6 --- parse.y +++ parse.y @@ -42,8 +42,7 @@ extern void yyerror(const char*); int num; } -%token TBOOL TSTRING TNUM -%token TDAEMON TIPV6 TPORT TPROTOCOLS TSERVER +%token TDAEMON TIPV6 TPORT TPROTOCOLS TMIME TDEFAULT TTYPE TSERVER %token TCERT TKEY TROOT TCGI %token TERR @@ -66,6 +65,8 @@ option : TDAEMON TBOOL { conf.foreground = !$2; } if (tls_config_parse_protocols(&conf.protos, $2) == -1) errx(1, "invalid protocols string \"%s\"", $2); } + | TMIME TSTRING TSTRING { add_mime($2, $3); } + | TDEFAULT TTYPE TSTRING { set_default_mime($3); } ; vhosts : /* empty */ blob - 646b930168fa41fca9b3e967f88e8857586b01a4 blob + 08d6541f8b98c058eacd154f3d1140fbeeaee7ee --- sample.conf +++ sample.conf @@ -4,6 +4,9 @@ daemon on # enable daemon mode # decomment to allow only TLSv1.3 #protocols "tlsv1.3" +# add the mapping for the extension rtf to the MIME application/rtf +mime "application/rtf" "rtf" + # server block example server "example.com" { cert "/path/to/cert.pem"