From 2f8d7b8ad62c05ee78bdfd63af18bd633a64c2e0 Mon Sep 17 00:00:00 2001 From: DarthSim Date: Fri, 5 Oct 2018 22:20:29 +0600 Subject: [PATCH] return ETag support --- etag.go | 9 +++++---- process.go | 2 +- processing_options.go | 2 +- server.go | 16 ++++++++-------- 4 files changed, 15 insertions(+), 14 deletions(-) diff --git a/etag.go b/etag.go index 57880e24..38db4da5 100644 --- a/etag.go +++ b/etag.go @@ -1,6 +1,7 @@ package main import ( + "context" "crypto/sha256" "encoding/binary" "fmt" @@ -8,14 +9,14 @@ import ( var notModifiedErr = newError(304, "Not modified", "Not modified") -func calcETag(b []byte, po *processingOptions) string { - footprint := sha256.Sum256(b) +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, *po) + binary.Write(hash, binary.LittleEndian, *getProcessingOptions(ctx)) - return fmt.Sprintf("%x", hash.Sum(nil)) + return []byte(fmt.Sprintf("%x", hash.Sum(nil))) } diff --git a/process.go b/process.go index efb99e95..b04187b6 100644 --- a/process.go +++ b/process.go @@ -208,7 +208,7 @@ func processImage(ctx context.Context) ([]byte, error) { defer C.vips_cleanup() data := getImageData(ctx).Bytes() - po := getprocessingOptions(ctx) + po := getProcessingOptions(ctx) imgtype := getImageType(ctx) if po.Gravity.Type == gravitySmart && !vipsSupportSmartcrop { diff --git a/processing_options.go b/processing_options.go index f23a8265..acb16870 100644 --- a/processing_options.go +++ b/processing_options.go @@ -666,6 +666,6 @@ func getImageURL(ctx context.Context) string { return ctx.Value(imageURLCtxKey).(string) } -func getprocessingOptions(ctx context.Context) *processingOptions { +func getProcessingOptions(ctx context.Context) *processingOptions { return ctx.Value(processingOptionsCtxKey).(*processingOptions) } diff --git a/server.go b/server.go index 9a562a4c..733678af 100644 --- a/server.go +++ b/server.go @@ -83,7 +83,7 @@ func writeCORS(rctx *fasthttp.RequestCtx) { func respondWithImage(ctx context.Context, reqID string, rctx *fasthttp.RequestCtx, data []byte) { rctx.SetStatusCode(200) - po := getprocessingOptions(ctx) + po := getProcessingOptions(ctx) rctx.SetContentType(mimes[po.Format]) rctx.Response.Header.Set("Cache-Control", fmt.Sprintf("max-age=%d, public", conf.TTL)) @@ -185,14 +185,14 @@ func serveHTTP(rctx *fasthttp.RequestCtx) { checkTimeout(ctx) - // if conf.ETagEnabled { - // eTag := calcETag(b, &procOpt) - // rw.Header().Set("ETag", eTag) + if conf.ETagEnabled { + eTag := calcETag(ctx) + rctx.Response.Header.SetBytesV("ETag", eTag) - // if eTag == r.Header.Get("If-None-Match") { - // panic(notModifiedErr) - // } - // } + if bytes.Equal(eTag, rctx.Request.Header.Peek("If-None-Match")) { + panic(notModifiedErr) + } + } checkTimeout(ctx)