diff --git a/pkg/ext/fileserver.go b/pkg/ext/fileserver.go
index fdea08eb941ad2e92b15c9646aa4c4455c47d6a7..ee4a80b1127e7f7cb6d5d1124931b7f2d65b7b9b 100644
--- a/pkg/ext/fileserver.go
+++ b/pkg/ext/fileserver.go
@@ -2,6 +2,8 @@ package ext
import (
"io/fs"
+ "mime"
+ "path/filepath"
"github.com/valyala/fasthttp"
)
@@ -10,9 +12,22 @@ type FileSystem interface {
Open(name string) (fs.File, error)
}
+// This is a VERY simple file server. It does not take a lot into consideration
+// and it should only be used to return small predictable files, like in the
+// static folder.
func FileServer(rootFS FileSystem, rootPath string) fasthttp.RequestHandler {
- return func(r *fasthttp.RequestCtx) {
- path := r.UserValue("filepath").(string)
- r.SendFile(rootPath + path)
+ return func(ctx *fasthttp.RequestCtx) {
+ path := ctx.UserValue("filepath").(string)
+
+ f, err := rootFS.Open(rootPath + path)
+ if err != nil {
+ InternalServerError(ctx, err)
+ return
+ }
+ defer f.Close()
+
+ m := mime.TypeByExtension(filepath.Ext(path))
+ ctx.SetContentType(m)
+ ctx.SetBodyStream(f, -1)
}
}
diff --git a/templates/layout.html b/templates/layout.html
index e21ec5e8b6f8c4d9f66356eca18052a829dc7cc4..bbf1558ff080063b0610a80f4d9846a8a9cad9ce 100644
--- a/templates/layout.html
+++ b/templates/layout.html
@@ -4,7 +4,7 @@ <head>
<meta charset="utf-8">
<title>img | {{block "title" .}} noop {{end}}</title>
<link rel="stylesheet" href="/static/main.css">
- <link rel="icon" href="static/square.svg" sizes="any" type="image/svg+xml">
+ <link rel="icon" href="/static/square.svg" sizes="any" type="image/svg+xml">
<meta name="viewport" content="width=device-width, initial-scale=1" />
</head>
<body>