diff --git a/http/handler.go b/http/handler.go index f6af32b..132bb6b 100644 --- a/http/handler.go +++ b/http/handler.go @@ -16,6 +16,11 @@ type ErrorData struct { Message any } +type DirectoryData struct { + Name string + Entries []fs.DirEntry +} + type Handler struct { Environment *step.Environment Directories bool @@ -79,10 +84,8 @@ func (this *Handler) ServeHTTP (res http.ResponseWriter, req *http.Request) { return } - // TODO: serve a directory and return - // have a custom directory listing document that takes in a list - // of the files in the directory and the path to the directory - // as data + this.serveDirectory(res, req, pat) + return } this.serveFile(res, req, pat) @@ -102,6 +105,38 @@ func (this *Handler) serveFile ( this.serveDocument(res, req, name) } +func (this *Handler) serveDirectory ( + res http.ResponseWriter, + req *http.Request, + pat string, +) { + name := pathToName(pat) + entries, err := readDir(this.Environment.GetFS(), name) + if err != nil { + this.serveError(res, req, http.StatusInternalServerError, err, false) + return + } + if this.DirectoryDocument == "" { + this.serveFile(res, req, pat) + return + } + document, err := this.Environment.Parse(this.DirectoryDocument) + if err != nil { + this.serveError(res, req, http.StatusInternalServerError, err, false) + return + } + err = document.Execute(res, step.ExecutionData { + Data: DirectoryData { + Name: name, + Entries: entries, + }, + }) + if err != nil { + this.serveError(res, req, http.StatusInternalServerError, err, false) + return + } +} + func (this *Handler) serveDocument ( res http.ResponseWriter, req *http.Request, @@ -214,3 +249,16 @@ func pathToName (pat string) string { } return pat } + +func readDir (filesystem fs.FS, name string) ([]fs.DirEntry, error) { + if filesystem, ok := filesystem.(fs.ReadDirFS); ok { + return filesystem.ReadDir(name) + } + dir, err := filesystem.Open(name) + if err != nil { return nil, err } + defer dir.Close() + if dir, ok := dir.(fs.ReadDirFile); ok { + return dir.ReadDir(0) + } + return nil, nil +}