diff --git a/web/fs.go b/web/fs.go new file mode 100644 index 0000000..7796a9b --- /dev/null +++ b/web/fs.go @@ -0,0 +1,54 @@ +package web + +import ( + "io" + "net/http" + "os" +) + +// Credit: https://stackoverflow.com/questions/49589685/good-way-to-disable-directory-listing-with-http-fileserver-in-go +type justFilesFilesystem struct { + fs http.FileSystem + // readDirBatchSize - configuration parameter for `Readdir` func + readDirBatchSize int +} + +func (fs justFilesFilesystem) Open(name string) (http.File, error) { + f, err := fs.fs.Open(name) + if err != nil { + return nil, err + } + return neuteredStatFile{File: f, readDirBatchSize: fs.readDirBatchSize}, nil +} + +type neuteredStatFile struct { + http.File + readDirBatchSize int +} + +func (e neuteredStatFile) Stat() (os.FileInfo, error) { + s, err := e.File.Stat() + if err != nil { + return nil, err + } + if s.IsDir() { + LOOP: + for { + fl, err := e.File.Readdir(e.readDirBatchSize) + switch err { + case io.EOF: + break LOOP + case nil: + for _, f := range fl { + if f.Name() == "index.html" { + return s, err + } + } + default: + return nil, err + } + } + return nil, os.ErrNotExist + } + return s, err +} diff --git a/web/web.go b/web/web.go index c4417b6..a5ff8b1 100644 --- a/web/web.go +++ b/web/web.go @@ -91,13 +91,8 @@ func pages(w http.ResponseWriter, r *http.Request) { } conf := config.LoadedConfig() - - uri := strings.Split(r.RequestURI, "?")[0] - if strings.HasSuffix(uri, ".html") || strings.HasSuffix(uri, ".js") { - http.FileServer(http.Dir(conf.AssetsPath)).ServeHTTP(w, r) - } else { - w.WriteHeader(http.StatusForbidden) - } + fs := justFilesFilesystem{fs: http.Dir(conf.AssetsPath), readDirBatchSize: 2} + http.FileServer(fs).ServeHTTP(w, r) } func empty(w http.ResponseWriter, r *http.Request) {