mirror of
				https://github.com/imgproxy/imgproxy.git
				synced 2025-10-30 23:08:02 +02:00 
			
		
		
		
	Add ETag buster
This commit is contained in:
		| @@ -1,6 +1,9 @@ | ||||
| # Changelog | ||||
|  | ||||
| ## [Unreleased] | ||||
| ### Added | ||||
| - Add `IMGPROXY_ETAG_BUSTER` config. | ||||
|  | ||||
| ### Change | ||||
| - Improved ICC profiles handling. | ||||
| - Proper error message when the deprecated basic URL format is used. | ||||
|   | ||||
| @@ -90,6 +90,7 @@ var ( | ||||
| 	ABSEndpoint         string | ||||
|  | ||||
| 	ETagEnabled bool | ||||
| 	ETagBuster  string | ||||
|  | ||||
| 	BaseURL string | ||||
|  | ||||
| @@ -226,6 +227,7 @@ func Reset() { | ||||
| 	ABSEndpoint = "" | ||||
|  | ||||
| 	ETagEnabled = false | ||||
| 	ETagBuster = "" | ||||
|  | ||||
| 	BaseURL = "" | ||||
|  | ||||
| @@ -371,6 +373,7 @@ func Configure() error { | ||||
| 	configurators.String(&ABSEndpoint, "IMGPROXY_ABS_ENDPOINT") | ||||
|  | ||||
| 	configurators.Bool(&ETagEnabled, "IMGPROXY_USE_ETAG") | ||||
| 	configurators.String(&ETagBuster, "IMGPROXY_ETAG_BUSTER") | ||||
|  | ||||
| 	configurators.String(&BaseURL, "IMGPROXY_BASE_URL") | ||||
|  | ||||
|   | ||||
| @@ -41,6 +41,7 @@ echo $(xxd -g 2 -l 64 -p /dev/random | tr -d '\n') | ||||
| * `IMGPROXY_PATH_PREFIX`: URL path prefix. Example: when set to `/abc/def`, imgproxy URL will be `/abc/def/%signature/%processing_options/%source_url`. Default: blank. | ||||
| * `IMGPROXY_USER_AGENT`: User-Agent header that will be sent with source image request. Default: `imgproxy/%current_version`; | ||||
| * `IMGPROXY_USE_ETAG`: when `true`, enables using [ETag](https://en.wikipedia.org/wiki/HTTP_ETag) HTTP header for HTTP cache control. Default: false; | ||||
| * `IMGPROXY_ETAG_BUSTER`: change this to change ETags for all the images. Default: blank. | ||||
| * `IMGPROXY_CUSTOM_REQUEST_HEADERS`: <i class='badge badge-pro'></i> list of custom headers that imgproxy will send while requesting the source image, divided by `\;` (can be redefined by `IMGPROXY_CUSTOM_HEADERS_SEPARATOR`). Example: `X-MyHeader1=Lorem\;X-MyHeader2=Ipsum`; | ||||
| * `IMGPROXY_CUSTOM_RESPONSE_HEADERS`: <i class='badge badge-pro'></i> list of custom response headers, divided by `\;` (can be redefined by `IMGPROXY_CUSTOM_HEADERS_SEPARATOR`). Example: `X-MyHeader1=Lorem\;X-MyHeader2=Ipsum`; | ||||
| * `IMGPROXY_CUSTOM_HEADERS_SEPARATOR`: <i class='badge badge-pro'></i> string that will be used as a custom headers separator. Default: `\;`; | ||||
|   | ||||
| @@ -10,9 +10,9 @@ import ( | ||||
| 	"strings" | ||||
| 	"sync" | ||||
|  | ||||
| 	"github.com/imgproxy/imgproxy/v3/config" | ||||
| 	"github.com/imgproxy/imgproxy/v3/imagedata" | ||||
| 	"github.com/imgproxy/imgproxy/v3/options" | ||||
| 	"github.com/imgproxy/imgproxy/v3/version" | ||||
| ) | ||||
|  | ||||
| type eTagCalc struct { | ||||
| @@ -93,7 +93,7 @@ func (h *Handler) SetActualProcessingOptions(po *options.ProcessingOptions) bool | ||||
| 	defer eTagCalcPool.Put(c) | ||||
|  | ||||
| 	c.hash.Reset() | ||||
| 	c.hash.Write([]byte(version.Version())) | ||||
| 	c.hash.Write([]byte(config.ETagBuster)) | ||||
| 	c.enc.Encode(po) | ||||
|  | ||||
| 	h.poHashActual = base64.RawURLEncoding.EncodeToString(c.hash.Sum(nil)) | ||||
|   | ||||
| @@ -6,6 +6,7 @@ import ( | ||||
| 	"strings" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/imgproxy/imgproxy/v3/config" | ||||
| 	"github.com/imgproxy/imgproxy/v3/imagedata" | ||||
| 	"github.com/imgproxy/imgproxy/v3/options" | ||||
| 	"github.com/sirupsen/logrus" | ||||
| @@ -24,8 +25,8 @@ var ( | ||||
| 		Data: []byte("Hello Test"), | ||||
| 	} | ||||
|  | ||||
| 	etagReq  string | ||||
| 	etagData string | ||||
| 	etagReq  = `"yj0WO6sFU4GCciYUBWjzvvfqrBh869doeOC2Pp5EI1Y/RImxvcmVtaXBzdW1kb2xvciI"` | ||||
| 	etagData = `"yj0WO6sFU4GCciYUBWjzvvfqrBh869doeOC2Pp5EI1Y/DvyChhMNu_sFX7jrjoyrgQbnFwfoOVv7kzp_Fbs6hQBg"` | ||||
| ) | ||||
|  | ||||
| type EtagTestSuite struct { | ||||
| @@ -36,13 +37,6 @@ type EtagTestSuite struct { | ||||
|  | ||||
| func (s *EtagTestSuite) SetupSuite() { | ||||
| 	logrus.SetOutput(ioutil.Discard) | ||||
|  | ||||
| 	s.h.SetActualProcessingOptions(po) | ||||
| 	s.h.SetActualImageData(&imgWithETag) | ||||
| 	etagReq = s.h.GenerateActualETag() | ||||
|  | ||||
| 	s.h.SetActualImageData(&imgWithoutETag) | ||||
| 	etagData = s.h.GenerateActualETag() | ||||
| } | ||||
|  | ||||
| func (s *EtagTestSuite) TeardownSuite() { | ||||
| @@ -51,6 +45,7 @@ func (s *EtagTestSuite) TeardownSuite() { | ||||
|  | ||||
| func (s *EtagTestSuite) SetupTest() { | ||||
| 	s.h = Handler{} | ||||
| 	config.Reset() | ||||
| } | ||||
|  | ||||
| func (s *EtagTestSuite) TestGenerateActualReq() { | ||||
| @@ -137,6 +132,13 @@ func (s *EtagTestSuite) TestImageDataCheckReqToDataFailure() { | ||||
| 	assert.False(s.T(), s.h.SetActualImageData(&imgWithoutETag)) | ||||
| } | ||||
|  | ||||
| func (s *EtagTestSuite) TestETagBusterFailure() { | ||||
| 	config.ETagBuster = "busted" | ||||
|  | ||||
| 	s.h.ParseExpectedETag(etagReq) | ||||
| 	assert.False(s.T(), s.h.SetActualImageData(&imgWithoutETag)) | ||||
| } | ||||
|  | ||||
| func TestEtag(t *testing.T) { | ||||
| 	suite.Run(t, new(EtagTestSuite)) | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user