Handle index.html correctly in custom served folders (#3168)

* getStringMapString return nil if key not found
* Refactor custom routes. Handle /index.html
This commit is contained in:
WithoutPants 2022-11-22 10:21:15 +11:00 committed by GitHub
parent af28fd0f3b
commit 7bb35b2b09
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 47 additions and 13 deletions

View File

@ -0,0 +1,35 @@
package api
import (
"net/http"
"strings"
"github.com/go-chi/chi"
"github.com/stashapp/stash/internal/manager/config"
)
type customRoutes struct {
servedFolders config.URLMap
}
func (rs customRoutes) Routes() chi.Router {
r := chi.NewRouter()
r.HandleFunc("/*", func(w http.ResponseWriter, r *http.Request) {
r.URL.Path = strings.Replace(r.URL.Path, "/custom", "", 1)
// http.FileServer redirects to / if the path ends with index.html
r.URL.Path = strings.TrimSuffix(r.URL.Path, "/index.html")
// map the path to the applicable filesystem location
var dir string
r.URL.Path, dir = rs.servedFolders.GetFilesystemLocation(r.URL.Path)
if dir != "" {
http.FileServer(http.Dir(dir)).ServeHTTP(w, r)
} else {
http.NotFound(w, r)
}
})
return r
}

View File

@ -231,18 +231,9 @@ func Start() error {
// Serve static folders
customServedFolders := c.GetCustomServedFolders()
if customServedFolders != nil {
r.HandleFunc("/custom/*", func(w http.ResponseWriter, r *http.Request) {
r.URL.Path = strings.Replace(r.URL.Path, "/custom", "", 1)
// map the path to the applicable filesystem location
var dir string
r.URL.Path, dir = customServedFolders.GetFilesystemLocation(r.URL.Path)
if dir != "" {
http.FileServer(http.Dir(dir)).ServeHTTP(w, r)
} else {
http.NotFound(w, r)
}
})
r.Mount("/custom", customRoutes{
servedFolders: customServedFolders,
}.Routes())
}
customUILocation := c.GetCustomUILocation()

View File

@ -466,7 +466,15 @@ func (i *Instance) getStringMapString(key string) map[string]string {
i.RLock()
defer i.RUnlock()
return i.viper(key).GetStringMapString(key)
ret := i.viper(key).GetStringMapString(key)
// GetStringMapString returns an empty map regardless of whether the
// key exists or not.
if len(ret) == 0 {
return nil
}
return ret
}
type StashConfig struct {