99 "io"
1010 "net"
1111 "net/http"
12- "net/http/httputil"
1312 "net/url"
1413 "os"
1514 "path/filepath"
@@ -19,12 +18,12 @@ import (
1918 "strings"
2019
2120 _ "github.com/jdeng/goheif"
22- _ "github.com/kettek/apng"
21+ "github.com/kettek/apng"
2322 _ "golang.org/x/image/bmp"
2423 _ "golang.org/x/image/tiff"
2524 _ "golang.org/x/image/webp"
2625 "image"
27- _ "image/gif"
26+ "image/gif"
2827 _ "image/jpeg"
2928
3029 "github.com/chai2010/webp"
@@ -287,45 +286,50 @@ func ImageHandler(c echo.Context) error {
287286 return c .String (500 , err .Error ())
288287 }
289288
290- b , err := httputil . DumpResponse ( resp , true )
289+ cache , err := os . Create ( requestCachePath )
291290 if err != nil {
292- err := errors .Wrap (err , "Failed to dump response" )
293- span .RecordError (err )
294- return c .String (500 , err .Error ())
295- }
296-
297- err = os .WriteFile (requestCachePath , b , 0644 )
298- if err != nil {
299- err := errors .Wrap (err , "Failed to write cache file" )
291+ err := errors .Wrap (err , "Failed to create cache file" )
300292 span .RecordError (err )
301293 return c .String (500 , err .Error ())
302294 }
295+ defer cache .Close ()
296+ resp .Write (cache )
303297 }
304298
305299 // load image
306300 _ , loadSpan := tracer .Start (ctx , "LoadImage" )
307- buf := new (bytes.Buffer )
308- tee := io .TeeReader (reader , buf )
309- img , format , err := image .Decode (tee )
301+ data , err := io .ReadAll (reader )
302+ img , format , err := image .Decode (bytes .NewReader (data ))
310303
311304 // check if the image is animated
312305 isAnimated := false
313306 if err == nil {
314- _ , isAnimated = img .(* image.Paletted )
307+ switch format {
308+ case "gif" :
309+ gifImg , err := gif .DecodeAll (bytes .NewReader (data ))
310+ if err == nil && len (gifImg .Image ) > 1 {
311+ isAnimated = true
312+ }
313+ case "apng" :
314+ apngImg , err := apng .DecodeAll (bytes .NewReader (data ))
315+ if err == nil && len (apngImg .Frames ) > 1 {
316+ isAnimated = true
317+ }
318+ }
315319 }
316320
317321 if err != nil || isAnimated {
318322 if err != nil {
319323 fmt .Printf ("Fallback to original image: %s (%s) %s\n " , remoteURL , format , err )
320324 }
321325 c .Response ().Header ().Set ("Cache-Control" , "public, max-age=86400, s-maxage=86400, immutable" )
322- return c .Stream (200 , contentType , io . MultiReader ( buf , reader ))
326+ return c .Stream (200 , contentType , bytes . NewReader ( data ))
323327 }
324328 loadSpan .End ()
325329
326330 orientation := 1
327331 if format == "jpeg" {
328- exifData , err := exif .Decode (buf )
332+ exifData , err := exif .Decode (bytes . NewReader ( data ) )
329333 if err == nil {
330334 exifOrient , err := exifData .Get (exif .Orientation )
331335 if err == nil {
0 commit comments