From 5377c2941fb4b7242307e461b60202c6615596ec Mon Sep 17 00:00:00 2001 From: Solderpunk Date: Sun, 28 Jun 2020 00:12:32 +0200 Subject: [PATCH] Allow overriding MIME types based on path regexes. --- README.md | 1 + config.go | 1 + handler.go | 13 ++++++++++--- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 7bebcce..dac5489 100644 --- a/README.md +++ b/README.md @@ -92,6 +92,7 @@ The following options can be set in `/etc/molly.conf`: * `LogPath`: Path to log file (default value `molly.log`). Note that all intermediate directories must exist, Molly Brown won't create them for you. +* `MimeOverrides`: A map from path regexs to MIME types. If the path of a file which is about to be served matches the regex, the specified MIME type will be used instead of one inferred from the filename extension. * `DirectorySort`: A string specifying how to sort files in automatically generated directory listings. Must be one of "Name", "Size" or "Time" (default value "Name"). * `DirectoryReverse` (boolean): if true, automatically generated directory listings will list files in descending order of whatever `DirectorySort` is set to (default value false). * `DirectoryTitles` (boolean): if true, automatically generated directory listings will use the first top-level heading (i.e. line beginning with "# ") in files with an extension of `GeminiExt` instead of the filename (default value false). diff --git a/config.go b/config.go index 5370357..7477c91 100644 --- a/config.go +++ b/config.go @@ -17,6 +17,7 @@ type Config struct { LogPath string TempRedirects map[string]string PermRedirects map[string]string + MimeOverrides map[string]string CGIPaths []string SCGIPaths map[string]string DirectorySort string diff --git a/handler.go b/handler.go index b45bae6..4d25a1f 100644 --- a/handler.go +++ b/handler.go @@ -380,14 +380,21 @@ func serveFile(path string, log *LogEntry, conn net.Conn, config Config) { } else { mimeType = mime.TypeByExtension(ext) } - // Add lang parameter - if mimeType == "text/gemini" && config.DefaultLang != "" { - mimeType += "; lang=" + config.DefaultLang + // Override extension-based MIME type + for pathRegex, newType := range config.MimeOverrides { + overridden, err := regexp.Match(pathRegex, []byte(path)) + if err == nil && overridden { + mimeType = newType + } } // Set a generic MIME type if the extension wasn't recognised if mimeType == "" { mimeType = "application/octet-stream" } + // Add lang parameter + if mimeType == "text/gemini" && config.DefaultLang != "" { + mimeType += "; lang=" + config.DefaultLang + } contents, err := ioutil.ReadFile(path) if err != nil {