This is an automated email from the ASF dual-hosted git repository.
membphis pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/apisix.git
The following commit(s) were added to refs/heads/master by this push:
new 81c1c7c change: don't treat route segment with ':' as parameter by
default (#3154)
81c1c7c is described below
commit 81c1c7c0778b11bdef274be1d5c4e54e1429cc21
Author: 罗泽轩 <[email protected]>
AuthorDate: Wed Dec 30 22:13:05 2020 +0800
change: don't treat route segment with ':' as parameter by default (#3154)
Fix #3134
---
apisix/admin/init.lua | 2 +-
apisix/api_router.lua | 2 +-
apisix/control/router.lua | 2 +-
apisix/http/router/{radixtree_uri.lua => base.lua} | 43 ++-----
apisix/http/router/radixtree_host_uri.lua | 29 +----
apisix/http/router/radixtree_uri.lua | 99 +--------------
.../http/router/radixtree_uri_with_parameter.lua | 46 +++++++
apisix/router.lua | 23 ++++
apisix/ssl/router/radixtree_sni.lua | 4 +-
apisix/utils/router.lua | 34 +++++
conf/config-default.yaml | 3 +
doc/architecture-design.md | 1 +
doc/router-radixtree.md | 20 +++
doc/zh-cn/architecture-design.md | 1 +
rockspec/apisix-master-0.rockspec | 2 +-
t/router/radixtree-host-uri2.t | 139 +++++++++++++++++++++
t/router/radixtree-uri-host.t | 53 ++++++++
.../radixtree-uri-with-parameter.t} | 16 +++
18 files changed, 362 insertions(+), 157 deletions(-)
diff --git a/apisix/admin/init.lua b/apisix/admin/init.lua
index b5a20af..12f63f4 100644
--- a/apisix/admin/init.lua
+++ b/apisix/admin/init.lua
@@ -16,7 +16,7 @@
--
local require = require
local core = require("apisix.core")
-local route = require("resty.radixtree")
+local route = require("apisix.utils.router")
local plugin = require("apisix.plugin")
local ngx = ngx
local get_method = ngx.req.get_method
diff --git a/apisix/api_router.lua b/apisix/api_router.lua
index 3f1cebc..f382258 100644
--- a/apisix/api_router.lua
+++ b/apisix/api_router.lua
@@ -15,7 +15,7 @@
-- limitations under the License.
--
local require = require
-local router = require("resty.radixtree")
+local router = require("apisix.utils.router")
local plugin_mod = require("apisix.plugin")
local ip_restriction = require("apisix.plugins.ip-restriction")
local core = require("apisix.core")
diff --git a/apisix/control/router.lua b/apisix/control/router.lua
index 86ea769..821cee8 100644
--- a/apisix/control/router.lua
+++ b/apisix/control/router.lua
@@ -15,7 +15,7 @@
-- limitations under the License.
--
local require = require
-local router = require("resty.radixtree")
+local router = require("apisix.utils.router")
local builtin_v1_routes = require("apisix.control.v1")
local plugin_mod = require("apisix.plugin")
local core = require("apisix.core")
diff --git a/apisix/http/router/radixtree_uri.lua b/apisix/http/router/base.lua
similarity index 81%
copy from apisix/http/router/radixtree_uri.lua
copy to apisix/http/router/base.lua
index 41ceb68..1cef301 100644
--- a/apisix/http/router/radixtree_uri.lua
+++ b/apisix/http/router/base.lua
@@ -15,23 +15,20 @@
-- limitations under the License.
--
local require = require
-local router = require("resty.radixtree")
+local radixtree = require("resty.radixtree")
+local router = require("apisix.utils.router")
local core = require("apisix.core")
local http_route = require("apisix.http.route")
local ipairs = ipairs
local type = type
local error = error
local loadstring = loadstring
-local user_routes
-local cached_version
-local _M = {version = 0.2}
+local _M = {}
- local uri_routes = {}
- local uri_router
-local function create_radixtree_router(routes)
+function _M.create_radixtree_uri_router(routes, uri_routes, with_parameter)
routes = routes or {}
core.table.clear(uri_routes)
@@ -81,22 +78,16 @@ local function create_radixtree_router(routes)
end
core.log.info("route items: ", core.json.delay_encode(uri_routes, true))
- uri_router = router.new(uri_routes)
-end
-
- local match_opts = {}
-function _M.match(api_ctx)
- if not cached_version or cached_version ~= user_routes.conf_version then
- create_radixtree_router(user_routes.values)
- cached_version = user_routes.conf_version
+ if with_parameter then
+ return radixtree.new(uri_routes)
+ else
+ return router.new(uri_routes)
end
+end
- if not uri_router then
- core.log.error("failed to fetch valid `uri` router: ")
- return true
- end
+function _M.match_uri(uri_router, match_opts, api_ctx)
core.table.clear(match_opts)
match_opts.method = api_ctx.var.request_method
match_opts.host = api_ctx.var.host
@@ -109,18 +100,8 @@ function _M.match(api_ctx)
end
-function _M.routes()
- if not user_routes then
- return nil, nil
- end
-
- return user_routes.values, user_routes.conf_version
-end
-
-
function _M.init_worker(filter)
- local err
- user_routes, err = core.config.new("/routes", {
+ local user_routes, err = core.config.new("/routes", {
automatic = true,
item_schema = core.schema.route,
checker = http_route.check_route,
@@ -129,6 +110,8 @@ function _M.init_worker(filter)
if not user_routes then
error("failed to create etcd instance for fetching /routes : " .. err)
end
+
+ return user_routes
end
diff --git a/apisix/http/router/radixtree_host_uri.lua
b/apisix/http/router/radixtree_host_uri.lua
index ad2b31e..08e0655 100644
--- a/apisix/http/router/radixtree_host_uri.lua
+++ b/apisix/http/router/radixtree_host_uri.lua
@@ -15,16 +15,13 @@
-- limitations under the License.
--
local require = require
-local router = require("resty.radixtree")
+local router = require("apisix.utils.router")
local core = require("apisix.core")
-local http_route = require("apisix.http.route")
local ipairs = ipairs
local type = type
-local error = error
local tab_insert = table.insert
local loadstring = loadstring
local pairs = pairs
-local user_routes
local cached_version
local host_router
local only_uri_router
@@ -126,6 +123,7 @@ end
local match_opts = {}
function _M.match(api_ctx)
+ local user_routes = _M.user_routes
if not cached_version or cached_version ~= user_routes.conf_version then
create_radixtree_router(user_routes.values)
cached_version = user_routes.conf_version
@@ -151,27 +149,4 @@ function _M.match(api_ctx)
end
-function _M.routes()
- if not user_routes then
- return nil, nil
- end
-
- return user_routes.values, user_routes.conf_version
-end
-
-
-function _M.init_worker(filter)
- local err
- user_routes, err = core.config.new("/routes", {
- automatic = true,
- item_schema = core.schema.route,
- checker = http_route.check_route,
- filter = filter,
- })
- if not user_routes then
- error("failed to create etcd instance for fetching /routes : " .. err)
- end
-end
-
-
return _M
diff --git a/apisix/http/router/radixtree_uri.lua
b/apisix/http/router/radixtree_uri.lua
index 41ceb68..2ed9a89 100644
--- a/apisix/http/router/radixtree_uri.lua
+++ b/apisix/http/router/radixtree_uri.lua
@@ -15,14 +15,8 @@
-- limitations under the License.
--
local require = require
-local router = require("resty.radixtree")
local core = require("apisix.core")
-local http_route = require("apisix.http.route")
-local ipairs = ipairs
-local type = type
-local error = error
-local loadstring = loadstring
-local user_routes
+local base_router = require("apisix.http.router.base")
local cached_version
@@ -31,64 +25,12 @@ local _M = {version = 0.2}
local uri_routes = {}
local uri_router
-local function create_radixtree_router(routes)
- routes = routes or {}
-
- core.table.clear(uri_routes)
-
- for _, route in ipairs(routes) do
- if type(route) == "table" then
- local status = core.table.try_read_attr(route, "value", "status")
- -- check the status
- if status and status == 0 then
- goto CONTINUE
- end
-
- local filter_fun, err
- if route.value.filter_func then
- filter_fun, err = loadstring(
- "return " .. route.value.filter_func,
- "router#" .. route.value.id)
- if not filter_fun then
- core.log.error("failed to load filter function: ", err,
- " route id: ", route.value.id)
- goto CONTINUE
- end
-
- filter_fun = filter_fun()
- end
-
- core.log.info("insert uri route: ",
- core.json.delay_encode(route.value))
- core.table.insert(uri_routes, {
- paths = route.value.uris or route.value.uri,
- methods = route.value.methods,
- priority = route.value.priority,
- hosts = route.value.hosts or route.value.host,
- remote_addrs = route.value.remote_addrs
- or route.value.remote_addr,
- vars = route.value.vars,
- filter_fun = filter_fun,
- handler = function (api_ctx, match_opts)
- api_ctx.matched_params = nil
- api_ctx.matched_route = route
- api_ctx.curr_req_matched = match_opts.matched
- end
- })
-
- ::CONTINUE::
- end
- end
-
- core.log.info("route items: ", core.json.delay_encode(uri_routes, true))
- uri_router = router.new(uri_routes)
-end
-
-
local match_opts = {}
function _M.match(api_ctx)
+ local user_routes = _M.user_routes
if not cached_version or cached_version ~= user_routes.conf_version then
- create_radixtree_router(user_routes.values)
+ uri_router =
base_router.create_radixtree_uri_router(user_routes.values,
+ uri_routes, false)
cached_version = user_routes.conf_version
end
@@ -97,38 +39,7 @@ function _M.match(api_ctx)
return true
end
- core.table.clear(match_opts)
- match_opts.method = api_ctx.var.request_method
- match_opts.host = api_ctx.var.host
- match_opts.remote_addr = api_ctx.var.remote_addr
- match_opts.vars = api_ctx.var
- match_opts.matched = core.tablepool.fetch("matched_route_record", 0, 4)
-
- local ok = uri_router:dispatch(api_ctx.var.uri, match_opts, api_ctx,
match_opts)
- return ok
-end
-
-
-function _M.routes()
- if not user_routes then
- return nil, nil
- end
-
- return user_routes.values, user_routes.conf_version
-end
-
-
-function _M.init_worker(filter)
- local err
- user_routes, err = core.config.new("/routes", {
- automatic = true,
- item_schema = core.schema.route,
- checker = http_route.check_route,
- filter = filter,
- })
- if not user_routes then
- error("failed to create etcd instance for fetching /routes : " .. err)
- end
+ return base_router.match_uri(uri_router, match_opts, api_ctx)
end
diff --git a/apisix/http/router/radixtree_uri_with_parameter.lua
b/apisix/http/router/radixtree_uri_with_parameter.lua
new file mode 100644
index 0000000..3fb7610
--- /dev/null
+++ b/apisix/http/router/radixtree_uri_with_parameter.lua
@@ -0,0 +1,46 @@
+--
+-- Licensed to the Apache Software Foundation (ASF) under one or more
+-- contributor license agreements. See the NOTICE file distributed with
+-- this work for additional information regarding copyright ownership.
+-- The ASF licenses this file to You under the Apache License, Version 2.0
+-- (the "License"); you may not use this file except in compliance with
+-- the License. You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+--
+local require = require
+local core = require("apisix.core")
+local base_router = require("apisix.http.router.base")
+local cached_version
+
+
+local _M = {}
+
+
+ local uri_routes = {}
+ local uri_router
+ local match_opts = {}
+function _M.match(api_ctx)
+ local user_routes = _M.user_routes
+ if not cached_version or cached_version ~= user_routes.conf_version then
+ uri_router =
base_router.create_radixtree_uri_router(user_routes.values,
+ uri_routes, true)
+ cached_version = user_routes.conf_version
+ end
+
+ if not uri_router then
+ core.log.error("failed to fetch valid `uri_with_parameter` router: ")
+ return true
+ end
+
+ return base_router.match_uri(uri_router, match_opts, api_ctx)
+end
+
+
+return _M
diff --git a/apisix/router.lua b/apisix/router.lua
index b76b16d..c8e1c0c 100644
--- a/apisix/router.lua
+++ b/apisix/router.lua
@@ -15,6 +15,7 @@
-- limitations under the License.
--
local require = require
+local base_router = require("apisix.http.router.base")
local core = require("apisix.core")
local plugin_checker = require("apisix.plugin").plugin_checker
local error = error
@@ -67,6 +68,27 @@ local function filter(route)
end
+-- attach common methods if the router doesn't provide its custom
implementation
+local function attach_http_router_common_methods(http_router)
+ if http_router.routes == nil then
+ http_router.routes = function ()
+ if not http_router.user_routes then
+ return nil, nil
+ end
+
+ local user_routes = http_router.user_routes
+ return user_routes.values, user_routes.conf_version
+ end
+ end
+
+ if http_router.init_worker == nil then
+ http_router.init_worker = function (filter)
+ http_router.user_routes = base_router.init_worker(filter)
+ end
+ end
+end
+
+
function _M.http_init_worker()
local conf = core.config.local_conf()
local router_http_name = "radixtree_uri"
@@ -78,6 +100,7 @@ function _M.http_init_worker()
end
local router_http = require("apisix.http.router." .. router_http_name)
+ attach_http_router_common_methods(router_http)
router_http.init_worker(filter)
_M.router_http = router_http
diff --git a/apisix/ssl/router/radixtree_sni.lua
b/apisix/ssl/router/radixtree_sni.lua
index 2aa01d2..0790627 100644
--- a/apisix/ssl/router/radixtree_sni.lua
+++ b/apisix/ssl/router/radixtree_sni.lua
@@ -15,7 +15,7 @@
-- limitations under the License.
--
local get_request = require("resty.core.base").get_request
-local radixtree_new = require("resty.radixtree").new
+local router_new = require("apisix.utils.router").new
local core = require("apisix.core")
local apisix_ssl = require("apisix.ssl")
local ngx_ssl = require("ngx.ssl")
@@ -118,7 +118,7 @@ local function create_router(ssl_items)
if #route_items > 1 then
core.log.info("we have more than 1 ssl certs now")
end
- local router, err = radixtree_new(route_items)
+ local router, err = router_new(route_items)
if not router then
return nil, err
end
diff --git a/apisix/utils/router.lua b/apisix/utils/router.lua
new file mode 100644
index 0000000..8b6b604
--- /dev/null
+++ b/apisix/utils/router.lua
@@ -0,0 +1,34 @@
+--
+-- Licensed to the Apache Software Foundation (ASF) under one or more
+-- contributor license agreements. See the NOTICE file distributed with
+-- this work for additional information regarding copyright ownership.
+-- The ASF licenses this file to You under the Apache License, Version 2.0
+-- (the "License"); you may not use this file except in compliance with
+-- the License. You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+--
+local resty_router = require("resty.radixtree")
+
+
+local _M = {}
+
+do
+ local router_opts = {
+ no_param_match = true
+ }
+
+function _M.new(routes)
+ return resty_router.new(routes, router_opts)
+end
+
+end
+
+
+return _M
diff --git a/conf/config-default.yaml b/conf/config-default.yaml
index 1029da4..7638f04 100644
--- a/conf/config-default.yaml
+++ b/conf/config-default.yaml
@@ -88,6 +88,9 @@ apisix:
router:
http: 'radixtree_uri' # radixtree_uri: match route by uri(base on
radixtree)
# radixtree_host_uri: match route by host +
uri(base on radixtree)
+ # radixtree_uri_with_parameter: like
radixtree_uri but match uri with parameters,
+ # see
https://github.com/api7/lua-resty-radixtree/#parameters-in-path for
+ # more details.
ssl: 'radixtree_sni' # radixtree_sni: match route by SNI(base on
radixtree)
# stream_proxy: # TCP/UDP proxy
# tcp: # TCP proxy port list
diff --git a/doc/architecture-design.md b/doc/architecture-design.md
index 2166845..a434d97 100644
--- a/doc/architecture-design.md
+++ b/doc/architecture-design.md
@@ -461,6 +461,7 @@ Set the route that best suits your business needs in the
local configuration `co
* `Prefix match`: Use `*` at the end to represent the given `uri` as a
prefix match. For example, `/foo*` allows matching `/foo/`, `/foo/a` and
`/foo/b`.
* `match priority`: first try absolute match, if you can't hit
absolute match, try prefix match.
* `Any filter attribute`: Allows you to specify any Nginx built-in
variable as a filter, such as URL request parameters, request headers, cookies,
and so on.
+ * `radixtree_uri_with_parameter`: Like `radixtree_uri` but also support
parameter match.
* `radixtree_host_uri`: Use `host + uri` as the primary index (based on
the `radixtree` engine), matching both host and URL for the current request.
* `apisix.router.ssl`: SSL loads the matching route.
diff --git a/doc/router-radixtree.md b/doc/router-radixtree.md
index aaeda5d..648d0fe 100644
--- a/doc/router-radixtree.md
+++ b/doc/router-radixtree.md
@@ -68,6 +68,26 @@ Here are the rules:
|/blog/foo/gloo | `/blog/foo/*` |
|/blog/bar | not match |
+#### 4. Parameter match
+
+When `radixtree_uri_with_parameter` is used, we can match routes with
parameters.
+
+For example, with configuration:
+```yaml
+apisix:
+ router:
+ http: 'radixtree_uri_with_parameter'
+```
+
+route like
+```
+/blog/:name
+```
+
+will match both `/blog/dog` and `/blog/cat`.
+
+For more details, see
https://github.com/api7/lua-resty-radixtree/#parameters-in-path.
+
### How to filter route by Nginx builtin variable
Please take a look at
[radixtree-new](https://github.com/iresty/lua-resty-radixtree#new),
diff --git a/doc/zh-cn/architecture-design.md b/doc/zh-cn/architecture-design.md
index d867e9b..cedfe90 100644
--- a/doc/zh-cn/architecture-design.md
+++ b/doc/zh-cn/architecture-design.md
@@ -472,6 +472,7 @@ APISIX 区别于其他 API 网关的一大特点是允许用户选择不同 Rout
* `前缀匹配`:末尾使用 `*` 代表给定的 `uri` 是前缀匹配。比如 `/foo*`,则允许匹配
`/foo/`、`/foo/a`和`/foo/b`等。
* `匹配优先级`:优先尝试绝对匹配,若无法命中绝对匹配,再尝试前缀匹配。
* `任意过滤属性`:允许指定任何 Nginx 内置变量作为过滤条件,比如 URL 请求参数、请求头、cookie 等。
+ * `radixtree_uri_with_parameter`: 同 `radixtree_uri` 但额外有参数匹配的功能。
* `radixtree_host_uri`: 使用 `host + uri` 作为主索引(基于 `radixtree`
引擎),对当前请求会同时匹配 host 和 uri,支持的匹配条件与 `radixtree_uri` 基本一致。
* `apisix.router.ssl`: SSL 加载匹配路由。
diff --git a/rockspec/apisix-master-0.rockspec
b/rockspec/apisix-master-0.rockspec
index bf2912a..a5fc0c8 100644
--- a/rockspec/apisix-master-0.rockspec
+++ b/rockspec/apisix-master-0.rockspec
@@ -42,7 +42,7 @@ dependencies = {
"lua-resty-cookie = 0.1.0",
"lua-resty-session = 2.24",
"opentracing-openresty = 0.1",
- "lua-resty-radixtree = 2.5",
+ "lua-resty-radixtree = 2.6",
"lua-protobuf = 0.3.1",
"lua-resty-openidc = 1.7.2-1",
"luafilesystem = 1.7.0-2",
diff --git a/t/router/radixtree-host-uri2.t b/t/router/radixtree-host-uri2.t
index eb49091..df8a88d 100644
--- a/t/router/radixtree-host-uri2.t
+++ b/t/router/radixtree-host-uri2.t
@@ -195,3 +195,142 @@ qr/1981/
use config_center: yaml
--- no_error_log
[error]
+
+
+
+=== TEST 6: set route with ':'
+--- yaml_config
+apisix:
+ node_listen: 1984
+ router:
+ http: 'radixtree_host_uri'
+ admin_key: null
+--- 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": "/file:listReputationHistories",
+ "plugins":{"proxy-rewrite":{"uri":"/hello"}},
+ "upstream": {
+ "nodes": {
+ "127.0.0.1:1980": 1
+ },
+ "type": "roundrobin"
+ }
+ }]]
+ )
+
+ if code >= 300 then
+ ngx.status = code
+ end
+ ngx.say(body)
+ }
+ }
+--- request
+GET /t
+--- response_body
+passed
+--- no_error_log
+[error]
+
+
+
+=== TEST 7: hit routes
+--- yaml_config
+apisix:
+ router:
+ http: 'radixtree_host_uri'
+--- request
+GET /file:listReputationHistories
+--- response_body
+hello world
+--- no_error_log
+[error]
+
+
+
+=== TEST 8: not hit
+--- yaml_config
+apisix:
+ router:
+ http: 'radixtree_host_uri'
+--- request
+GET /file:xx
+--- error_code: 404
+--- no_error_log
+[error]
+
+
+
+=== TEST 9: set route with ':' & host
+--- yaml_config
+apisix:
+ node_listen: 1984
+ router:
+ http: 'radixtree_host_uri'
+ admin_key: null
+--- 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": "/do:listReputationHistories",
+ "hosts": ["t.com"],
+ "plugins":{"proxy-rewrite":{"uri":"/hello"}},
+ "upstream": {
+ "nodes": {
+ "127.0.0.1:1980": 1
+ },
+ "type": "roundrobin"
+ }
+ }]]
+ )
+
+ if code >= 300 then
+ ngx.status = code
+ end
+ ngx.say(body)
+ }
+ }
+--- request
+GET /t
+--- response_body
+passed
+--- no_error_log
+[error]
+
+
+
+=== TEST 10: hit routes
+--- yaml_config
+apisix:
+ router:
+ http: 'radixtree_host_uri'
+--- request
+GET /do:listReputationHistories
+--- more_headers
+Host: t.com
+--- response_body
+hello world
+--- no_error_log
+[error]
+
+
+
+=== TEST 11: not hit
+--- yaml_config
+apisix:
+ router:
+ http: 'radixtree_host_uri'
+--- request
+GET /do:xx
+--- more_headers
+Host: t.com
+--- error_code: 404
+--- no_error_log
+[error]
diff --git a/t/router/radixtree-uri-host.t b/t/router/radixtree-uri-host.t
index 7dab68c..a0d1141 100644
--- a/t/router/radixtree-uri-host.t
+++ b/t/router/radixtree-uri-host.t
@@ -246,3 +246,56 @@ GET /hello?name=json
hello world
--- no_error_log
[error]
+
+
+
+=== TEST 15: set route with ':'
+--- 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": "/file:listReputationHistories",
+ "plugins":{"proxy-rewrite":{"uri":"/hello"}},
+ "upstream": {
+ "nodes": {
+ "127.0.0.1:1980": 1
+ },
+ "type": "roundrobin"
+ }
+ }]]
+ )
+
+ if code >= 300 then
+ ngx.status = code
+ end
+ ngx.say(body)
+ }
+ }
+--- request
+GET /t
+--- response_body
+passed
+--- no_error_log
+[error]
+
+
+
+=== TEST 16: hit routes
+--- request
+GET /file:listReputationHistories
+--- response_body
+hello world
+--- no_error_log
+[error]
+
+
+
+=== TEST 17: not hit
+--- request
+GET /file:xx
+--- error_code: 404
+--- no_error_log
+[error]
diff --git a/t/node/route-parameter-uri.t
b/t/router/radixtree-uri-with-parameter.t
similarity index 93%
rename from t/node/route-parameter-uri.t
rename to t/router/radixtree-uri-with-parameter.t
index 8da02c1..70fd59a 100644
--- a/t/node/route-parameter-uri.t
+++ b/t/router/radixtree-uri-with-parameter.t
@@ -22,6 +22,22 @@ worker_connections(256);
no_root_location();
no_shuffle();
+our $yaml_config = <<_EOC_;
+apisix:
+ node_listen: 1984
+ admin_key: null
+ router:
+ http: 'radixtree_uri_with_parameter'
+_EOC_
+
+add_block_preprocessor(sub {
+ my ($block) = @_;
+
+ if (!$block->yaml_config) {
+ $block->set_value("yaml_config", $yaml_config);
+ }
+});
+
run_tests();
__DATA__