1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- package main
- import (
- "context"
- "crypto/sha256"
- "encoding/hex"
- "encoding/json"
- "hash"
- "sync"
- "github.com/imgproxy/imgproxy/v2/imagedata"
- "github.com/imgproxy/imgproxy/v2/options"
- "github.com/imgproxy/imgproxy/v2/version"
- )
- type eTagCalc struct {
- hash hash.Hash
- enc *json.Encoder
- }
- var eTagCalcPool = sync.Pool{
- New: func() interface{} {
- h := sha256.New()
- enc := json.NewEncoder(h)
- enc.SetEscapeHTML(false)
- enc.SetIndent("", "")
- return &eTagCalc{h, enc}
- },
- }
- func calcETag(ctx context.Context, imgdata *imagedata.ImageData, po *options.ProcessingOptions) string {
- c := eTagCalcPool.Get().(*eTagCalc)
- defer eTagCalcPool.Put(c)
- c.hash.Reset()
- c.hash.Write(imgdata.Data)
- footprint := c.hash.Sum(nil)
- c.hash.Reset()
- c.hash.Write(footprint)
- c.hash.Write([]byte(version.Version()))
- c.enc.Encode(po)
- return hex.EncodeToString(c.hash.Sum(nil))
- }
|