http: Add the ability to serve a directory
This commit is contained in:
parent
68c8deb269
commit
70a1194bca
@ -16,6 +16,11 @@ type ErrorData struct {
|
|||||||
Message any
|
Message any
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type DirectoryData struct {
|
||||||
|
Name string
|
||||||
|
Entries []fs.DirEntry
|
||||||
|
}
|
||||||
|
|
||||||
type Handler struct {
|
type Handler struct {
|
||||||
Environment *step.Environment
|
Environment *step.Environment
|
||||||
Directories bool
|
Directories bool
|
||||||
@ -79,10 +84,8 @@ func (this *Handler) ServeHTTP (res http.ResponseWriter, req *http.Request) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: serve a directory and return
|
this.serveDirectory(res, req, pat)
|
||||||
// have a custom directory listing document that takes in a list
|
return
|
||||||
// of the files in the directory and the path to the directory
|
|
||||||
// as data
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this.serveFile(res, req, pat)
|
this.serveFile(res, req, pat)
|
||||||
@ -102,6 +105,38 @@ func (this *Handler) serveFile (
|
|||||||
this.serveDocument(res, req, name)
|
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 (
|
func (this *Handler) serveDocument (
|
||||||
res http.ResponseWriter,
|
res http.ResponseWriter,
|
||||||
req *http.Request,
|
req *http.Request,
|
||||||
@ -214,3 +249,16 @@ func pathToName (pat string) string {
|
|||||||
}
|
}
|
||||||
return pat
|
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
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user