feat: new (optional) index file list for file system serve
This commit is contained in:
parent
aa0a11f3c5
commit
a6d67cf60a
2 changed files with 35 additions and 5 deletions
19
fs.go
19
fs.go
|
@ -33,6 +33,7 @@ type FS struct {
|
|||
UseLocalFolder bool
|
||||
LocalFolderPrefix string
|
||||
HeaderHandler HeaderHandler
|
||||
IndexFilenames []string
|
||||
}
|
||||
|
||||
// NewFS creates a new instance of the http file system used for serving static files.
|
||||
|
@ -51,13 +52,13 @@ func (fs *FS) ServeHTTP(w http.ResponseWriter, r *http.Request, info RoutingInfo
|
|||
}
|
||||
|
||||
// search for file in static file system
|
||||
file, filePath, err := fs.findFile(url)
|
||||
file, err := fs.findFile(url)
|
||||
if err != nil {
|
||||
http.NotFound(w, r)
|
||||
return
|
||||
}
|
||||
// check, if the file is a folder
|
||||
file, ok := fs.checkFolder(file, filePath)
|
||||
file, ok := fs.checkFolder(file, url)
|
||||
if !ok {
|
||||
http.NotFound(w, r)
|
||||
return
|
||||
|
@ -68,7 +69,7 @@ func (fs *FS) ServeHTTP(w http.ResponseWriter, r *http.Request, info RoutingInfo
|
|||
fs.serve(w, r, info, file)
|
||||
}
|
||||
|
||||
func (fs *FS) findFile(url string) (fs.File, string, error) {
|
||||
func (fs *FS) findFile(url string) (fs.File, error) {
|
||||
// build file path
|
||||
filePath := path.Join(fs.FolderPrefix, url)
|
||||
filePath = strings.TrimPrefix(filePath, "/")
|
||||
|
@ -83,7 +84,7 @@ func (fs *FS) findFile(url string) (fs.File, string, error) {
|
|||
|
||||
file, err := os.Open(localFilePath)
|
||||
if err == nil {
|
||||
return file, localFilePath, nil
|
||||
return file, nil
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -92,7 +93,7 @@ func (fs *FS) findFile(url string) (fs.File, string, error) {
|
|||
filePath = "."
|
||||
}
|
||||
file, err := fs.StaticFiles.Open(filePath)
|
||||
return file, filePath, err
|
||||
return file, err
|
||||
}
|
||||
|
||||
func (fs *FS) checkFolder(file fs.File, url string) (fs.File, bool) {
|
||||
|
@ -107,6 +108,14 @@ func (fs *FS) checkFolder(file fs.File, url string) (fs.File, bool) {
|
|||
// close folder handler (we don't need it anymore)
|
||||
_ = file.Close()
|
||||
|
||||
// check for index files
|
||||
for _, indexFileName := range fs.IndexFilenames {
|
||||
newFullPath := path.Join(url, indexFileName)
|
||||
if newFile, err := fs.findFile(newFullPath); err == nil {
|
||||
return newFile, true
|
||||
}
|
||||
}
|
||||
|
||||
return file, false
|
||||
}
|
||||
|
||||
|
|
21
fs_test.go
21
fs_test.go
|
@ -156,6 +156,27 @@ func TestFSFolderLocal(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestFSFolderIndex(t *testing.T) {
|
||||
// create new FS
|
||||
fs := NewFS(&staticFiles)
|
||||
fs.IndexFilenames = []string{"README.md"}
|
||||
|
||||
// serve the request
|
||||
tw := &testWriter{}
|
||||
tr := &http.Request{
|
||||
Method: http.MethodHead,
|
||||
URL: &url.URL{
|
||||
Path: "/",
|
||||
},
|
||||
}
|
||||
fs.ServeHTTP(tw, tr, RoutingInfo{})
|
||||
|
||||
// check data
|
||||
if tw.statusCode != http.StatusOK {
|
||||
t.Error("received invalid http status code", tw.statusCode)
|
||||
}
|
||||
}
|
||||
|
||||
func TestFSNotFound(t *testing.T) {
|
||||
// create new FS
|
||||
fs := NewFS(&staticFiles)
|
||||
|
|
Loading…
Add table
Reference in a new issue