diff --git a/apisix/patch.lua b/apisix/patch.lua index 850c6b112d2b..6bea36301aa3 100644 --- a/apisix/patch.lua +++ b/apisix/patch.lua @@ -23,6 +23,7 @@ local ngx_socket = ngx.socket local original_tcp = ngx.socket.tcp local concat_tab = table.concat local new_tab = require("table.new") +local expr = require("resty.expr.v1") local log = ngx.log local WARN = ngx.WARN local ipairs = ipairs @@ -227,6 +228,27 @@ local function luasocket_tcp() end +local patched_expr_new +do + local function eval_empty_rule(self, ctx, ...) + return true + end + + + local mt = {__index = {eval = eval_empty_rule}} + local old_expr_new = expr.new + + + function patched_expr_new(rule) + if #rule == 0 then + return setmetatable({}, mt) + end + + return old_expr_new(rule) + end +end + + function _M.patch() -- make linter happy -- luacheck: ignore @@ -238,6 +260,8 @@ function _M.patch() return luasocket_tcp() end + + expr.new = patched_expr_new end diff --git a/docs/en/latest/admin-api.md b/docs/en/latest/admin-api.md index d48079be2f48..0719df4b15d2 100644 --- a/docs/en/latest/admin-api.md +++ b/docs/en/latest/admin-api.md @@ -112,7 +112,7 @@ Config Example: "name": "route-xxx", "desc": "hello world", "remote_addrs": ["127.0.0.1"], # A set of Client IP. - "vars": [], # A list of one or more `{var, operator, val}` elements + "vars": [["http_user", "==", "ios"]], # A list of one or more `[var, operator, val]` elements "upstream_id": "1", # upstream id, recommended "upstream": {}, # upstream, not recommended "filter_func": "", # User-defined filtering function diff --git a/docs/zh/latest/admin-api.md b/docs/zh/latest/admin-api.md index d66097606904..c7315373340d 100644 --- a/docs/zh/latest/admin-api.md +++ b/docs/zh/latest/admin-api.md @@ -107,7 +107,7 @@ route 对象 json 配置内容: "name": "路由xxx", "desc": "hello world", "remote_addrs": ["127.0.0.1"], # 一组客户端请求 IP 地址 - "vars": [], # 由一个或多个 {var, operator, val} 元素组成的列表 + "vars": [["http_user", "==", "ios"]], # 由一个或多个 [var, operator, val] 元素组成的列表 "upstream_id": "1", # upstream 对象在 etcd 中的 id ,建议使用此值 "upstream": {}, # upstream 信息对象,建议尽量不要使用 "filter_func": "", # 用户自定义的过滤函数,非必填 diff --git a/t/router/radixtree-uri-vars.t b/t/router/radixtree-uri-vars.t index ea2f79a77eba..32d24b2bcac2 100644 --- a/t/router/radixtree-uri-vars.t +++ b/t/router/radixtree-uri-vars.t @@ -383,3 +383,48 @@ demo: prod --- error_code: 404 --- no_error_log [error] + + + +=== TEST 19: be compatible with empty vars +--- 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, + [=[{ + "methods": ["GET"], + "upstream": { + "nodes": { + "127.0.0.1:1980": 1 + }, + "type": "roundrobin" + }, + "uri": "/hello", + "vars": [] + }]=] + ) + + if code >= 300 then + ngx.status = code + end + ngx.say(body) + } + } +--- request +GET /t +--- response_body +passed +--- no_error_log +[error] + + + +=== TEST 20: hit +--- request +GET /hello +--- response_body +hello world +--- no_error_log +[error]