Files
2026-07-13 12:32:21 +08:00

158 lines
4.3 KiB
Lua

local cjson = require "cjson"
local helpers = require "spec.helpers"
for _, strategy in helpers.each_strategy() do
describe("URI encoding [#" .. strategy .. "]", function()
local proxy_client
lazy_setup(function()
local bp = helpers.get_db_utils(strategy, {
"routes",
"services",
})
bp.routes:insert {
hosts = { "mock_upstream" },
}
bp.routes:insert {
hosts = { "mock_upstream" },
}
bp.routes:insert {
protocols = { "http" },
paths = { "/request" },
strip_path = false,
}
bp.routes:insert {
protocols = { "http" },
paths = { "/stripped-path" },
strip_path = true,
}
assert(helpers.start_kong({
database = strategy,
nginx_conf = "spec/fixtures/custom_nginx.template",
}))
proxy_client = helpers.proxy_client()
end)
lazy_teardown(function()
helpers.stop_kong()
end)
it("issue #1975 does not double percent-encode proxied args", function()
-- https://github.com/Kong/kong/pull/1975
local res = assert(proxy_client:send {
method = "GET",
path = "/get?limit=25&where=%7B%22or%22:%5B%7B%22name%22:%7B%22like%22:%22%25bac%25%22%7D%7D%5D%7D",
headers = {
["Host"] = "mock_upstream",
},
})
local body = assert.res_status(200, res)
local json = cjson.decode(body)
assert.equal("25", json.uri_args.limit)
assert.equal([[{"or":[{"name":{"like":"%bac%"}}]}]], json.uri_args.where)
end)
it("issue #1480 does not percent-encode args unnecessarily", function()
-- behavior might not be correct, but we assert it anyways until
-- a change is planned and documented.
-- https://github.com/Mashape/kong/issues/1480
local res = assert(proxy_client:send {
method = "GET",
path = "/request?param=1.2.3",
headers = {
["Host"] = "mock_upstream",
},
})
local body = assert.res_status(200, res)
local json = cjson.decode(body)
assert.equal(helpers.mock_upstream_url .. "/request?param=1.2.3", json.url)
end)
it("issue #749 does not decode percent-encoded args", function()
-- https://github.com/Mashape/kong/issues/749
local res = assert(proxy_client:send {
method = "GET",
path = "/request?param=abc%7Cdef",
headers = {
["Host"] = "mock_upstream",
},
})
local body = assert.res_status(200, res)
local json = cjson.decode(body)
assert.equal(helpers.mock_upstream_url .. "/request?param=abc%7Cdef", json.url)
end)
it("issue #688 does not percent-decode proxied URLs", function()
-- https://github.com/Mashape/kong/issues/688
local res = assert(proxy_client:send {
method = "GET",
path = "/request/foo%2Fbar",
headers = {
["Host"] = "mock_upstream",
},
})
local body = assert.res_status(200, res)
local json = cjson.decode(body)
assert.equal(helpers.mock_upstream_url .. "/request/foo%2Fbar", json.url)
end)
it("issue #2512 does not double percent-encode upstream URLs", function()
-- https://github.com/Mashape/kong/issues/2512
-- with `hosts` matching
local res = assert(proxy_client:send {
method = "GET",
path = "/request/auth%2F123",
headers = {
["Host"] = "mock_upstream",
},
})
local body = assert.res_status(200, res)
local json = cjson.decode(body)
assert.matches("/request/auth%2F123", json.url, nil, true)
-- with `uris` matching
local res2 = assert(proxy_client:send {
method = "GET",
path = "/request/auth%2F123",
})
local body2 = assert.res_status(200, res2)
local json2 = cjson.decode(body2)
assert.matches("/request/auth%2F123", json2.url, nil, true)
-- with `uris` matching + `strip_uri`
local res3 = assert(proxy_client:send {
method = "GET",
path = "/stripped-path/request/auth%2F123",
})
local body3 = assert.res_status(200, res3)
local json3 = cjson.decode(body3)
assert.matches("/request/auth%2F123", json3.url, nil, true)
end)
end)
end