Skip to content

Commit ec6bfcf

Browse files
committed
update isAnimation detector
1 parent 11bc785 commit ec6bfcf

File tree

1 file changed

+22
-18
lines changed

1 file changed

+22
-18
lines changed

image.go

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import (
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

Comments
 (0)