all repos — website @ 127a675fc7cd9cdb65e4b4caac21e0f259102ee8

My website

serve files from Storage implementation

Alan Pearce
commit

127a675fc7cd9cdb65e4b4caac21e0f259102ee8

parent

04809ffd7971032818238db14feb6d3c95470e3b

1 file changed, 13 insertions(+), 69 deletions(-)

changed files
M internal/storage/files/reader.gointernal/storage/files/reader.go
@@ -1,12 +1,7 @@
package files import ( - "fmt" - "hash/fnv" - "io" "io/fs" - "mime" - "os" "path/filepath" "strings"
@@ -15,21 +10,6 @@
"gitlab.com/tozd/go/errors" ) -type File struct { - ContentType string - Etag string - Alternatives map[string]string -} - -func (f *File) AvailableEncodings() []string { - encs := []string{} - for enc := range f.Alternatives { - encs = append(encs, enc) - } - - return encs -} - type Reader struct { root string log *log.Logger
@@ -49,49 +29,13 @@
return r, nil } -func hashFile(filename string) (string, error) { - f, err := os.Open(filename) - if err != nil { - return "", errors.WithMessagef(err, "could not open file %s for hashing", filename) - } - defer f.Close() - hash := fnv.New64a() - if _, err := io.Copy(hash, f); err != nil { - return "", errors.WithMessagef(err, "could not hash file %s", filename) - } - - return fmt.Sprintf(`W/"%x"`, hash.Sum(nil)), nil -} - -var encodings = map[string]string{ - "br": ".br", - "gzip": ".gz", -} - -func (r *Reader) registerFile(urlpath string, fp string) error { - hash, err := hashFile(fp) +func (r *Reader) registerFile(urlpath string, filepath string) error { + file, err := r.OpenFile(urlpath, filepath) if err != nil { - return err - } - f := File{ - ContentType: mime.TypeByExtension(filepath.Ext(fp)), - Etag: hash, - Alternatives: map[string]string{ - "identity": fp, - }, + return errors.WithMessagef(err, "could not register file %s", filepath) } - for enc, suffix := range encodings { - _, err := os.Stat(fp + suffix) - if err != nil { - if errors.Is(err, os.ErrNotExist) { - continue - } - return err - } - f.Alternatives[enc] = fp + suffix - } - r.files[urlpath] = &f + r.files[urlpath] = file return nil }
@@ -101,22 +45,22 @@ err := filepath.WalkDir(r.root, func(filePath string, f fs.DirEntry, err error) error {
if err != nil { return errors.WithMessagef(err, "failed to access path %s", filePath) } + if f.IsDir() { + return nil + } + relPath, err := filepath.Rel(r.root, filePath) if err != nil { return errors.WithMessagef(err, "failed to make path relative, path: %s", filePath) } - urlPath, _ := strings.CutSuffix("/"+relPath, "index.html") - if !f.IsDir() { - switch filepath.Ext(relPath) { - case ".br", ".gz": - return nil - } - r.log.Debug("registering file", "urlpath", urlPath) + urlPath := fileNameToPathName("/" + relPath) - return r.registerFile(urlPath, filePath) + switch filepath.Ext(relPath) { + case ".br", ".gz": + return nil } - return nil + return r.registerFile(urlPath, filePath) }) if err != nil { return errors.WithMessage(err, "could not walk directory")