serve pre-compressed files according to accept-encoding
1 file changed, 37 insertions(+), 16 deletions(-)
changed files
M internal/website/filemap.go → internal/website/filemap.go
@@ -5,6 +5,7 @@ "fmt" "hash/fnv" "io" "io/fs" + "mime" "os" "path/filepath" "strings"@@ -15,11 +16,13 @@ "github.com/pkg/errors" ) type File struct { - filename string - etag string + filename string + contentType string + etag string + alternatives map[string]string } -var files = map[string]File{} +var files = map[string]*File{} func hashFile(filename string) (string, error) { f, err := os.Open(filename)@@ -35,20 +38,34 @@ return fmt.Sprintf(`W/"%x"`, hash.Sum(nil)), nil } -func registerFile(urlpath string, filepath string) error { - if files[urlpath] != (File{}) { - log.Info("registerFile called with duplicate file", "url_path", urlpath) +var encodings = map[string]string{ + "br": ".br", + "gzip": ".gz", +} - return nil - } - hash, err := hashFile(filepath) +func registerFile(urlpath string, fp string) error { + hash, err := hashFile(fp) if err != nil { return err } - files[urlpath] = File{ - filename: filepath, - etag: hash, + f := File{ + filename: fp, + contentType: mime.TypeByExtension(filepath.Ext(fp)), + etag: hash, + alternatives: map[string]string{}, + } + for enc, suffix := range encodings { + _, err := os.Stat(fp + suffix) + if err != nil { + if errors.Is(err, os.ErrNotExist) { + continue + } else { + return err + } + } + f.alternatives[enc] = fp + suffix } + files[urlpath] = &f return nil }@@ -62,11 +79,15 @@ relPath, err := filepath.Rel(root, filePath) if err != nil { return errors.WithMessagef(err, "failed to make path relative, path: %s", filePath) } - urlPath, _ := strings.CutSuffix(relPath, "index.html") + urlPath, _ := strings.CutSuffix("/"+relPath, "index.html") if !f.IsDir() { - log.Debug("registering file", "urlpath", "/"+urlPath) + switch filepath.Ext(relPath) { + case ".br", ".gz": + return nil + } + log.Debug("registering file", "urlpath", urlPath) - return registerFile("/"+urlPath, filePath) + return registerFile(urlPath, filePath) } return nil@@ -78,6 +99,6 @@ return nil } -func GetFile(urlPath string) File { +func GetFile(urlPath string) *File { return files[urlPath] }