From 85d2738a72d27199fd5cbf69a36839caf7a53952 Mon Sep 17 00:00:00 2001 From: DarthSim Date: Sat, 6 Oct 2018 01:45:14 +0600 Subject: [PATCH] Fix and optimize ETag calc --- etag.go | 51 +++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 39 insertions(+), 12 deletions(-) diff --git a/etag.go b/etag.go index 38db4da5..02beed83 100644 --- a/etag.go +++ b/etag.go @@ -3,20 +3,47 @@ package main import ( "context" "crypto/sha256" - "encoding/binary" - "fmt" + "encoding/hex" + "encoding/json" + "hash" + "sync" ) var notModifiedErr = newError(304, "Not modified", "Not modified") -func calcETag(ctx context.Context) []byte { - footprint := sha256.Sum256(getImageData(ctx).Bytes()) - - hash := sha256.New() - hash.Write(footprint[:]) - hash.Write([]byte(version)) - binary.Write(hash, binary.LittleEndian, conf) - binary.Write(hash, binary.LittleEndian, *getProcessingOptions(ctx)) - - return []byte(fmt.Sprintf("%x", hash.Sum(nil))) +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) []byte { + c := eTagCalcPool.Get().(*eTagCalc) + defer eTagCalcPool.Put(c) + + c.hash.Reset() + c.hash.Write(getImageData(ctx).Bytes()) + footprint := c.hash.Sum(nil) + + c.hash.Reset() + c.hash.Write(footprint) + c.hash.Write([]byte(version)) + c.enc.Encode(conf) + c.enc.Encode(getProcessingOptions(ctx)) + + etag := make([]byte, 64) + hex.Encode(etag, c.hash.Sum(nil)) + + return etag }