1commit a2dbab42d18c8d076c4ba592708dc23c1abfbb4b
2Author: Eric Bower <me@erock.io>
3Date: Thu Jun 19 11:32:47 2025 -0400
4
5 feat(pgs): fs adapter generate etag on-the-fly
6
7diff --git a/pkg/pobj/storage/fs.go b/pkg/pobj/storage/fs.go
8index c703b90..c29b1e3 100644
9--- a/pkg/pobj/storage/fs.go
10+++ b/pkg/pobj/storage/fs.go
11@@ -1,6 +1,8 @@
12 package storage
13
14 import (
15+ "crypto/md5"
16+ "encoding/hex"
17 "fmt"
18 "io"
19 "io/fs"
20@@ -14,6 +16,7 @@ import (
21
22 "github.com/picosh/pico/pkg/send/utils"
23 "github.com/picosh/pico/pkg/shared/mime"
24+ putils "github.com/picosh/utils"
25 )
26
27 // https://stackoverflow.com/a/32482941
28@@ -113,6 +116,20 @@ func (s *StorageFS) GetObject(bucket Bucket, fpath string) (utils.ReadAndReaderA
29 return nil, objInfo, err
30 }
31
32+ etag := ""
33+ // only generate etag if file is less than 10MB
34+ if info.Size() <= int64(10*putils.MB) {
35+ // calculate etag
36+ h := md5.New()
37+ tr := io.TeeReader(dat, h)
38+ if _, err := io.Copy(h, tr); err != nil {
39+ return nil, nil, err
40+ }
41+ md5Sum := h.Sum(nil)
42+ etag = hex.EncodeToString(md5Sum)
43+ }
44+
45+ objInfo.ETag = etag
46 objInfo.Size = info.Size()
47 objInfo.LastModified = info.ModTime()
48 objInfo.Metadata.Set("content-type", mime.GetMimeType(fpath))