feat(staticweb): enhance fallback logic for extensionless paths
Some checks failed
Build , Vet Test, and Lint / Run Vet Tests (1.23.x) (push) Failing after -35m7s
Build , Vet Test, and Lint / Run Vet Tests (1.24.x) (push) Failing after -35m7s
Build , Vet Test, and Lint / Lint Code (push) Failing after -35m7s
Build , Vet Test, and Lint / Build (push) Failing after -35m7s
Tests / Unit Tests (push) Failing after -35m8s
Tests / Integration Tests (push) Failing after -35m8s

* Added support for serving index.html for extensionless paths
* Updated isStaticAsset to exclude paths without extensions from static asset checks
This commit is contained in:
Hein
2026-05-21 13:30:39 +02:00
parent 0308644075
commit 57e7503389
2 changed files with 19 additions and 3 deletions

View File

@@ -75,11 +75,21 @@ func (m *mountPoint) ServeHTTP(w http.ResponseWriter, r *http.Request) {
fallbackPath := m.fallbackStrategy.GetFallbackPath(filePath) fallbackPath := m.fallbackStrategy.GetFallbackPath(filePath)
file, err = m.provider.Open(strings.TrimPrefix(fallbackPath, "/")) file, err = m.provider.Open(strings.TrimPrefix(fallbackPath, "/"))
if err == nil { if err == nil {
// Successfully opened fallback file
defer file.Close() defer file.Close()
m.serveFile(w, r, fallbackPath, file) m.serveFile(w, r, fallbackPath, file)
return return
} }
// For extensionless paths, also try path/index.html
if path.Ext(filePath) == "" {
indexFallback := path.Join(filePath, "index.html")
file, err = m.provider.Open(strings.TrimPrefix(indexFallback, "/"))
if err == nil {
defer file.Close()
m.serveFile(w, r, indexFallback, file)
return
}
}
} }
// No fallback or fallback failed - return 404 // No fallback or fallback failed - return 404

View File

@@ -49,9 +49,15 @@ func (f *HTMLFallbackStrategy) GetFallbackPath(filePath string) string {
return f.indexFile return f.indexFile
} }
// isStaticAsset checks if the path looks like a static asset (has a file extension). // isStaticAsset checks if the path looks like a static asset (has a non-HTML file extension).
// Paths with no extension are not considered static assets so fallback logic can resolve
// them to path.html or path/index.html.
func (f *HTMLFallbackStrategy) isStaticAsset(filePath string) bool { func (f *HTMLFallbackStrategy) isStaticAsset(filePath string) bool {
return path.Ext(filePath) != "" ext := strings.ToLower(path.Ext(filePath))
if ext == "" || ext == ".html" || ext == ".htm" {
return false
}
return true
} }
// ExtensionBasedFallback implements a fallback strategy that skips fallback for known static file extensions. // ExtensionBasedFallback implements a fallback strategy that skips fallback for known static file extensions.