use buffers as interface to storage
1 file changed, 19 insertions(+), 26 deletions(-)
changed files
M internal/storage/files/file.go → internal/storage/files/file.go
@@ -10,19 +10,18 @@ "path/filepath" "strings" "gitlab.com/tozd/go/errors" + "go.alanpearce.eu/website/internal/buffer" "go.alanpearce.eu/website/internal/storage" ) -type File struct { - storage.File -} +type Content io.ReadSeekCloser var encodings = map[string]string{ "br": ".br", "gzip": ".gz", } -func (r *Reader) OpenFile(path string, filename string) (*File, error) { +func (r *Reader) OpenFile(path string, filename string) (*storage.File, error) { f, err := os.Open(filename) if err != nil { return nil, errors.WithMessage(err, "could not open file for reading")@@ -37,15 +36,18 @@ if err != nil { return nil, errors.WithMessage(err, "could not calculate etag") } - file := &File{ - File: storage.File{ - Path: path, - ContentType: mime.TypeByExtension(filepath.Ext(filename)), - LastModified: stat.ModTime(), - Etag: etag, - Encodings: map[string]io.ReadSeekCloser{ - "identity": f, - }, + buf := new(buffer.Buffer) + if _, err := f.WriteTo(buf); err != nil { + return nil, errors.WithMessage(err, "could not read file") + } + + file := &storage.File{ + Path: path, + ContentType: mime.TypeByExtension(filepath.Ext(filename)), + LastModified: stat.ModTime(), + Etag: etag, + Encodings: map[string]*buffer.Buffer{ + "identity": buf, }, }@@ -58,10 +60,12 @@ } return nil, errors.WithMessagef(err, "could not stat file %s", filename+suffix) } - file.Encodings[enc], err = os.Open(filename + suffix) + bytes, err := os.ReadFile(filename + suffix) if err != nil { return nil, errors.WithMessagef(err, "could not read file %s", filename+suffix) } + buf := buffer.NewBuffer(bytes) + file.Encodings[enc] = buf } return file, nil@@ -76,23 +80,12 @@ return fmt.Sprintf(`W/"%x"`, hash.Sum(nil)), nil } -func (f *File) Close() error { - var errs []error - for _, enc := range f.Encodings { - if err := enc.Close(); err != nil { - errs = append(errs, err) - } - } - - return errors.Join(errs...) -} - func pathNameToFileName(pathname string) string { if strings.HasSuffix(pathname, "/") { pathname = pathname + "index.html" } - return pathname + return strings.TrimPrefix(pathname, "/") } func fileNameToPathName(filename string) string {