1
0
mirror of https://github.com/imgproxy/imgproxy.git synced 2025-07-02 22:46:50 +02:00

Implements #421 processing option to control meta stripping (#422)

* Implements processing option to control meta stripping

* Update based on code review comments

Change name of option to "stripmeta" and change how we handle config vs request setting logic

* Fix indentation style typo

* Fix indentation style typo

* Use full metadata naming for config and variables

Co-authored-by: John Koehl <johnk@zillowgroup.com>
Co-authored-by: John Koehl <jkoehl>
This commit is contained in:
John Koehl
2020-07-01 09:45:33 -04:00
committed by GitHub
parent bb695fa2c4
commit 616ec996b3
4 changed files with 68 additions and 35 deletions

View File

@ -428,6 +428,17 @@ It's highly recommended to prefer `cachebuster` option over URL query string bec
Default: empty 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 #### Filename
``` ```

View File

@ -639,7 +639,7 @@ func saveImageToFitBytes(po *processingOptions, img *vipsImage) ([]byte, context
img.CopyMemory() img.CopyMemory()
for { 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 { if len(result) <= po.MaxBytes || quality <= 10 || err != nil {
return result, cancel, err return result, cancel, err
} }
@ -767,5 +767,5 @@ func processImage(ctx context.Context) ([]byte, context.CancelFunc, error) {
return saveImageToFitBytes(po, img) return saveImageToFitBytes(po, img)
} }
return img.Save(po.Format, po.Quality, conf.StripMetadata) return img.Save(po.Format, po.Quality, po.StripMetadata)
} }

View File

@ -143,6 +143,7 @@ type processingOptions struct {
Background rgbColor Background rgbColor
Blur float32 Blur float32
Sharpen float32 Sharpen float32
StripMetadata bool
CacheBuster string CacheBuster string
@ -227,6 +228,7 @@ func newProcessingOptions() *processingOptions {
Sharpen: 0, Sharpen: 0,
Dpr: 1, Dpr: 1,
Watermark: watermarkOptions{Opacity: 1, Replicate: false, Gravity: gravityOptions{Type: gravityCenter}}, 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 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 { func applyProcessingOption(po *processingOptions, name string, args []string) error {
switch name { switch name {
case "format", "f", "ext": case "format", "f", "ext":
@ -894,6 +904,8 @@ func applyProcessingOption(po *processingOptions, name string, args []string) er
return applyCacheBusterOption(po, args) return applyCacheBusterOption(po, args)
case "filename", "fn": case "filename", "fn":
return applyFilenameOption(po, args) return applyFilenameOption(po, args)
case "strip_metadata", "sm":
return applyMetaStripmetaOption(po, args)
} }
return fmt.Errorf("Unknown processing option: %s", name) return fmt.Errorf("Unknown processing option: %s", name)

View File

@ -405,6 +405,16 @@ func (s *ProcessingOptionsTestSuite) TestParsePathAdvancedCachebuster() {
assert.Equal(s.T(), "123", po.CacheBuster) 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() { func (s *ProcessingOptionsTestSuite) TestParsePathWebpDetection() {
conf.EnableWebpDetection = true conf.EnableWebpDetection = true