pgs-etag-fly.diff

· erock's pastes · raw

expires: 2025-09-17

 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))