repos / pico

pico services mono repo
git clone https://github.com/picosh/pico.git

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