Commit Diff


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"