1
0
mirror of https://github.com/imgproxy/imgproxy.git synced 2025-09-16 09:36:18 +02:00

Limit GIF frames to being processed

This commit is contained in:
DarthSim
2018-11-15 20:04:12 +06:00
parent d9d143c9f8
commit e8845f671b
5 changed files with 21 additions and 2 deletions

View File

@@ -4,7 +4,7 @@
- [Plain source URLs](./docs/generating_the_url_advanced.md#plain) support; - [Plain source URLs](./docs/generating_the_url_advanced.md#plain) support;
- [Serving images from Google Cloud Storage](./docs/serving_files_from_google_cloud_storage.md); - [Serving images from Google Cloud Storage](./docs/serving_files_from_google_cloud_storage.md);
- [Full support of GIFs](./docs/image_formats_support.md) including animated ones; - [Full support of GIFs](./docs/image_formats_support.md#gif-support) including animated ones;
- [Watermarks](./docs/watermark.md); - [Watermarks](./docs/watermark.md);
- [New Relic](./docs/new_relic.md) metrics; - [New Relic](./docs/new_relic.md) metrics;
- [Prometheus](./docs/prometheus.md) metrics; - [Prometheus](./docs/prometheus.md) metrics;

View File

@@ -141,6 +141,7 @@ type config struct {
MaxSrcDimension int MaxSrcDimension int
MaxSrcResolution int MaxSrcResolution int
MaxGifFrames int
JpegProgressive bool JpegProgressive bool
PngInterlaced bool PngInterlaced bool
@@ -201,6 +202,7 @@ var conf = config{
TTL: 3600, TTL: 3600,
IgnoreSslVerification: false, IgnoreSslVerification: false,
MaxSrcResolution: 16800000, MaxSrcResolution: 16800000,
MaxGifFrames: 1,
AllowInsecure: false, AllowInsecure: false,
SignatureSize: 32, SignatureSize: 32,
Quality: 80, Quality: 80,
@@ -240,6 +242,7 @@ func init() {
intEnvConfig(&conf.MaxSrcDimension, "IMGPROXY_MAX_SRC_DIMENSION") intEnvConfig(&conf.MaxSrcDimension, "IMGPROXY_MAX_SRC_DIMENSION")
megaIntEnvConfig(&conf.MaxSrcResolution, "IMGPROXY_MAX_SRC_RESOLUTION") megaIntEnvConfig(&conf.MaxSrcResolution, "IMGPROXY_MAX_SRC_RESOLUTION")
intEnvConfig(&conf.MaxGifFrames, "IMGPROXY_MAX_GIF_FRAMES")
boolEnvConfig(&conf.JpegProgressive, "IMGPROXY_JPEG_PROGRESSIVE") boolEnvConfig(&conf.JpegProgressive, "IMGPROXY_JPEG_PROGRESSIVE")
boolEnvConfig(&conf.PngInterlaced, "IMGPROXY_PNG_INTERLACED") boolEnvConfig(&conf.PngInterlaced, "IMGPROXY_PNG_INTERLACED")
@@ -350,6 +353,10 @@ func init() {
log.Fatalf("Max src resolution should be greater than 0, now - %d\n", conf.MaxSrcResolution) log.Fatalf("Max src resolution should be greater than 0, now - %d\n", conf.MaxSrcResolution)
} }
if conf.MaxGifFrames <= 0 {
log.Fatalf("Max GIF frames should be greater than 0, now - %d\n", conf.MaxGifFrames)
}
if conf.Quality <= 0 { if conf.Quality <= 0 {
log.Fatalf("Quality should be greater than 0, now - %d\n", conf.Quality) log.Fatalf("Quality should be greater than 0, now - %d\n", conf.Quality)
} else if conf.Quality > 100 { } else if conf.Quality > 100 {

View File

@@ -42,6 +42,12 @@ imgproxy protects you from so-called image bombs. Here is how you can specify ma
* `IMGPROXY_MAX_SRC_RESOLUTION`: the maximum resolution of the source image, in megapixels. Images with larger actual size will be rejected. Default: `16.8`; * `IMGPROXY_MAX_SRC_RESOLUTION`: the maximum resolution of the source image, in megapixels. Images with larger actual size will be rejected. Default: `16.8`;
imgproxy can process animated GIFs, but since this operation is pretty heavy, only one frame is processed by default. You can increase the maximum of GIF frames to process with the following variable:
* `IMGPROXY_MAX_GIF_FRAMES`: the maximum of animated GIF frames to being processed. Default: `1`.
**Note:** imgproxy summarizes all GIF frames resolutions while checking source image resolution.
You can also specify a secret to enable authorization with the HTTP `Authorization` header for use in production environments: You can also specify a secret to enable authorization with the HTTP `Authorization` header for use in production environments:
* `IMGPROXY_SECRET`: the authorization token. If specified, the HTTP request should contain the `Authorization: Bearer %secret%` header; * `IMGPROXY_SECRET`: the authorization token. If specified, the HTTP request should contain the `Authorization: Bearer %secret%` header;

View File

@@ -10,3 +10,9 @@ At the moment, imgproxy supports only the most popular Web image formats:
## GIF support ## GIF support
imgproxy supports GIF output only when using libvips 8.7.0+ compiled with ImageMagick support. Official imgproxy Docker image supports GIF out of the box. imgproxy supports GIF output only when using libvips 8.7.0+ compiled with ImageMagick support. Official imgproxy Docker image supports GIF out of the box.
Since processing of animated GIFs is pretty heavy, only one frame is processed by default. You can increase the maximum of GIF frames to process with the following variable:
* `IMGPROXY_MAX_GIF_FRAMES`: the maximum of animated GIF frames to being processed. Default: `1`.
**Note:** imgproxy summarizes all GIF frames resolutions while checking source image resolution.

View File

@@ -425,7 +425,7 @@ func transformGif(ctx context.Context, img **C.struct__VipsImage, po *processing
return err return err
} }
framesCount := imgHeight / frameHeight framesCount := minInt(imgHeight/frameHeight, conf.MaxGifFrames)
frames := make([]*C.struct__VipsImage, framesCount) frames := make([]*C.struct__VipsImage, framesCount)
defer func() { defer func() {