diff --git a/docs/generating_the_url_advanced.md b/docs/generating_the_url_advanced.md index 09f4040f..300eaa91 100644 --- a/docs/generating_the_url_advanced.md +++ b/docs/generating_the_url_advanced.md @@ -428,6 +428,17 @@ It's highly recommended to prefer `cachebuster` option over URL query string bec Default: empty +#### Strip Metadata + +``` +strip_metadata:%strip_metadata +sm:%strip_metadata +``` + +When set to `1`, `t` or `true`, imgproxy will strip the metadata (EXIF, IPTC, etc.) on JPEG and WebP output images. Normally this is controlled by the [IMGPROXY_STRIP_METADATA](configuration.md#miscellaneous) configuration but this procesing option allows the configuration to be set for each request. + +Default: `false` + #### Filename ``` diff --git a/process.go b/process.go index 24a36661..9582142e 100644 --- a/process.go +++ b/process.go @@ -639,7 +639,7 @@ func saveImageToFitBytes(po *processingOptions, img *vipsImage) ([]byte, context img.CopyMemory() for { - result, cancel, err := img.Save(po.Format, quality, conf.StripMetadata) + result, cancel, err := img.Save(po.Format, quality, po.StripMetadata) if len(result) <= po.MaxBytes || quality <= 10 || err != nil { return result, cancel, err } @@ -767,5 +767,5 @@ func processImage(ctx context.Context) ([]byte, context.CancelFunc, error) { return saveImageToFitBytes(po, img) } - return img.Save(po.Format, po.Quality, conf.StripMetadata) + return img.Save(po.Format, po.Quality, po.StripMetadata) } diff --git a/processing_options.go b/processing_options.go index f0d1c976..3952bdf1 100644 --- a/processing_options.go +++ b/processing_options.go @@ -126,23 +126,24 @@ type watermarkOptions struct { } type processingOptions struct { - ResizingType resizeType - Width int - Height int - Dpr float64 - Gravity gravityOptions - Enlarge bool - Extend extendOptions - Crop cropOptions - Padding paddingOptions - Trim trimOptions - Format imageType - Quality int - MaxBytes int - Flatten bool - Background rgbColor - Blur float32 - Sharpen float32 + ResizingType resizeType + Width int + Height int + Dpr float64 + Gravity gravityOptions + Enlarge bool + Extend extendOptions + Crop cropOptions + Padding paddingOptions + Trim trimOptions + Format imageType + Quality int + MaxBytes int + Flatten bool + Background rgbColor + Blur float32 + Sharpen float32 + StripMetadata bool CacheBuster string @@ -211,22 +212,23 @@ var ( func newProcessingOptions() *processingOptions { newProcessingOptionsOnce.Do(func() { _newProcessingOptions = processingOptions{ - ResizingType: resizeFit, - Width: 0, - Height: 0, - Gravity: gravityOptions{Type: gravityCenter}, - Enlarge: false, - Extend: extendOptions{Enabled: false, Gravity: gravityOptions{Type: gravityCenter}}, - Padding: paddingOptions{Enabled: false}, - Trim: trimOptions{Enabled: false, Threshold: 10, Smart: true}, - Quality: conf.Quality, - MaxBytes: 0, - Format: imageTypeUnknown, - Background: rgbColor{255, 255, 255}, - Blur: 0, - Sharpen: 0, - Dpr: 1, - Watermark: watermarkOptions{Opacity: 1, Replicate: false, Gravity: gravityOptions{Type: gravityCenter}}, + ResizingType: resizeFit, + Width: 0, + Height: 0, + Gravity: gravityOptions{Type: gravityCenter}, + Enlarge: false, + Extend: extendOptions{Enabled: false, Gravity: gravityOptions{Type: gravityCenter}}, + Padding: paddingOptions{Enabled: false}, + Trim: trimOptions{Enabled: false, Threshold: 10, Smart: true}, + Quality: conf.Quality, + MaxBytes: 0, + Format: imageTypeUnknown, + Background: rgbColor{255, 255, 255}, + Blur: 0, + Sharpen: 0, + Dpr: 1, + Watermark: watermarkOptions{Opacity: 1, Replicate: false, Gravity: gravityOptions{Type: gravityCenter}}, + StripMetadata: conf.StripMetadata, } }) @@ -848,6 +850,14 @@ func applyFilenameOption(po *processingOptions, args []string) error { return nil } +func applyMetaStripmetaOption(po *processingOptions, args []string) error { + if len(args[0]) > 0 { + po.StripMetadata = parseBoolOption(args[0]) + } + + return nil +} + func applyProcessingOption(po *processingOptions, name string, args []string) error { switch name { case "format", "f", "ext": @@ -894,6 +904,8 @@ func applyProcessingOption(po *processingOptions, name string, args []string) er return applyCacheBusterOption(po, args) case "filename", "fn": return applyFilenameOption(po, args) + case "strip_metadata", "sm": + return applyMetaStripmetaOption(po, args) } return fmt.Errorf("Unknown processing option: %s", name) diff --git a/processing_options_test.go b/processing_options_test.go index 6f5b0cfd..a22ebe7a 100644 --- a/processing_options_test.go +++ b/processing_options_test.go @@ -405,6 +405,16 @@ func (s *ProcessingOptionsTestSuite) TestParsePathAdvancedCachebuster() { assert.Equal(s.T(), "123", po.CacheBuster) } +func (s *ProcessingOptionsTestSuite) TestParsePathAdvancedStripMetadata() { + req := s.getRequest("http://example.com/unsafe/strip_metadata:true/plain/http://images.dev/lorem/ipsum.jpg") + ctx, err := parsePath(context.Background(), req) + + require.Nil(s.T(), err) + + po := getProcessingOptions(ctx) + assert.True(s.T(), po.StripMetadata) +} + func (s *ProcessingOptionsTestSuite) TestParsePathWebpDetection() { conf.EnableWebpDetection = true