Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(proxy-cache): allow nil ctx vars in cache key #7168

Merged
merged 1 commit into from
Jun 1, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion apisix/plugins/proxy-cache/util.lua
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ function _M.generate_complex_value(data, ctx)
core.log.info("proxy-cache complex value index-", i, ": ", value)

if string.byte(value, 1, 1) == string.byte('$') then
tmp[i] = ctx.var[string.sub(value, 2)]
tmp[i] = ctx.var[string.sub(value, 2)] or ""
tokers marked this conversation as resolved.
Show resolved Hide resolved
else
tmp[i] = value
end
Expand Down
4 changes: 4 additions & 0 deletions docs/en/latest/plugins/proxy-cache.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,10 @@ The cache expiration time cannot be configured dynamically. It can only be set b

If the Upstream service is not available and APISIX returns a 502 or 504 status code, it will be cached for 10s.

Variables (start with `$`) can be specified in `cache_key`, `cache_bypass` and `no_cache`. It's worth mentioning that the variable value will be an empty string if it doesn't exist.

You can also combine a number of variables and strings (constants), by writing them into an array, eventually, variables will be parsed and stitched together with strings.

:::

## Enabling the Plugin
Expand Down
2 changes: 1 addition & 1 deletion docs/zh/latest/plugins/proxy-cache.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ title: proxy-cache
| no_cache | array[string] | 可选 | | | 是否缓存数据,可以使用变量,需要注意当此参数的值不为空或非'0'时将不会缓存数据 |
| cache_ttl | integer | 可选 | 300 秒 | | 当选项 cache_control 未开启或开启以后服务端没有返回缓存控制头时,提供的默认缓存时间 |

注:变量以$开头,也可以使用变量和字符串的结合,但是需要以数组的形式分开写,最终变量被解析后会和字符串拼接在一起。
注:变量以$开头,不存在时等价于空字符串。也可以使用变量和字符串的结合,但是需要以数组的形式分开写,最终变量被解析后会和字符串拼接在一起。

`conf/config.yaml` 文件中的配置示例:

Expand Down
50 changes: 50 additions & 0 deletions t/plugin/proxy-cache/disk.t
Original file line number Diff line number Diff line change
Expand Up @@ -707,3 +707,53 @@ GET /t
--- error_code: 400
--- response_body eval
qr/failed to check the configuration of plugin proxy-cache err/
=== TEST 28: nil vars for cache_key
--- 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,
[[{
"plugins": {
"proxy-cache": {
"cache_key": ["$arg_foo", "$arg_bar", "$arg_baz"],
"cache_zone": "disk_cache_one",
"cache_bypass": ["$arg_bypass"],
"cache_method": ["GET"],
"cache_http_status": [200],
"hide_cache_headers": true,
"no_cache": ["$arg_no_cache"]
}
},
"upstream": {
"nodes": {
"127.0.0.1:1986": 1
},
"type": "roundrobin"
},
"uri": "/hello"
}]]
)
if code >= 300 then
ngx.status = code
end
ngx.say(body)
}
}
--- request
GET /t
--- response_body
passed
=== TEST 29: hit route with nil vars in cache_key
--- request
GET /hello?bar=a
--- response_body chop
hello world!