Skip to content

Commit

Permalink
feat(gzip): support special * to match any type (apache#4817)
Browse files Browse the repository at this point in the history
  • Loading branch information
RocFang committed Aug 16, 2021
1 parent ca5ea1f commit e244940
Show file tree
Hide file tree
Showing 3 changed files with 79 additions and 20 deletions.
30 changes: 21 additions & 9 deletions apisix/plugins/gzip.lua
Expand Up @@ -21,17 +21,25 @@ local req_http_version = ngx.req.http_version
local str_sub = string.sub
local ipairs = ipairs
local tonumber = tonumber
local type = type


local schema = {
type = "object",
properties = {
types = {
type = "array",
minItems = 1,
items = {
type = "string",
minLength = 1,
anyOf = {
{
type = "array",
minItem = 1,
items = {
type = "string",
minLength = 1,
},
},
{
enum = {"*"}
}
},
default = {"text/html"}
},
Expand Down Expand Up @@ -110,11 +118,15 @@ function _M.header_filter(conf, ctx)
end

local matched = false
for _, ty in ipairs(types) do
if content_type == ty then
matched = true
break
if type(types) == "table" then
for _, ty in ipairs(types) do
if content_type == ty then
matched = true
break
end
end
else
matched = true
end
if not matched then
return
Expand Down
18 changes: 9 additions & 9 deletions docs/en/latest/plugins/gzip.md
Expand Up @@ -37,15 +37,15 @@ The `gzip` plugin dynamically set the gzip behavior of Nginx.

## Attributes

| Name | Type | Requirement | Default | Valid | Description |
| --------- | ------------- | ----------- | ---------- | ------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------- |
| types | array | optional | ["text/html"] | | dynamically set the `gzip_types` directive |
| min_length | integer | optional | 20 | >= 1 | dynamically set the `gzip_min_length` directive |
| comp_level | integer | optional | 1 | [1, 9] | dynamically set the `gzip_comp_level` directive |
| http_version | number | optional | 1.1 | 1.1, 1.0 | dynamically set the `gzip_http_version` directive |
| buffers.number | integer | optional | 32 | >= 1 | dynamically set the `gzip_buffers` directive |
| buffers.size | integer | optional | 4096 | >= 1 | dynamically set the `gzip_buffers` directive |
| vary | boolean | optional | false | | dynamically set the `gzip_vary` directive |
| Name | Type | Requirement | Default | Valid | Description |
| --------------------------------------| ------------| -------------- | -------- | --------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
| types | array[string] or "*" | optional | ["text/html"] | | dynamically set the `gzip_types` directive, special value `"*"` matches any MIME type |
| min_length | integer | optional | 20 | >= 1 | dynamically set the `gzip_min_length` directive |
| comp_level | integer | optional | 1 | [1, 9] | dynamically set the `gzip_comp_level` directive |
| http_version | number | optional | 1.1 | 1.1, 1.0 | dynamically set the `gzip_http_version` directive |
| buffers.number | integer | optional | 32 | >= 1 | dynamically set the `gzip_buffers` directive |
| buffers.size | integer | optional | 4096 | >= 1 | dynamically set the `gzip_buffers` directive |
| vary | boolean | optional | false | | dynamically set the `gzip_vary` directive |

## How To Enable

Expand Down
51 changes: 49 additions & 2 deletions t/plugin/gzip.t
Expand Up @@ -395,7 +395,7 @@ Content-Encoding: gzip
=== TEST 15: vary
=== TEST 15: match all types
--- config
location /t {
content_by_lua_block {
Expand All @@ -412,7 +412,7 @@ Content-Encoding: gzip
},
"plugins": {
"gzip": {
"vary": true
"types": "*"
}
}
}]]
Expand All @@ -436,6 +436,53 @@ POST /echo
012345678
--- more_headers
Accept-Encoding: gzip
Content-Type: video/3gpp
--- response_headers
Content-Encoding: gzip
=== TEST 17: vary
--- config
location /t {
content_by_lua_block {
local t = require("lib.test_admin").test
local code, body = t('/apisix/admin/routes/1',
ngx.HTTP_PUT,
[[{
"uri": "/echo",
"upstream": {
"type": "roundrobin",
"nodes": {
"127.0.0.1:1980": 1
}
},
"plugins": {
"gzip": {
"vary": true
}
}
}]]
)
if code >= 300 then
ngx.status = code
end
ngx.say(body)
}
}
--- response_body
passed
=== TEST 18: hit
--- request
POST /echo
0123456789
012345678
--- more_headers
Accept-Encoding: gzip
Vary: upstream
Content-Type: text/html
--- response_headers
Expand Down

0 comments on commit e244940

Please sign in to comment.