goveal/internal/app/routing/layered_fs.go

42 lines
889 B
Go
Raw Normal View History

package routing
import (
"errors"
"net/http"
"path/filepath"
)
type LayeredHandler struct {
layers []http.FileSystem
}
func (l *LayeredHandler) AddHandlers(layers ...http.FileSystem) {
l.layers = append(l.layers, layers...)
}
func (l LayeredHandler) ServeHTTP(writer http.ResponseWriter, request *http.Request) {
_, fileName := filepath.Split(request.URL.Path)
f, err := l.selectLayer(request.URL.Path)
if err != nil {
writer.WriteHeader(404)
return
}
defer f.Close()
stat, err := f.Stat()
if err != nil {
writer.WriteHeader(500)
return
}
http.ServeContent(writer, request, fileName, stat.ModTime(), f)
}
func (l LayeredHandler) selectLayer(requestedFilePath string) (f http.File, err error) {
for idx := range l.layers {
layer := l.layers[idx]
if f, err = layer.Open(requestedFilePath); err == nil {
return
}
}
return nil, errors.New("not found")
}