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

256 lines
7.3 KiB
Lua

local helpers = require "spec.helpers"
local clone = require "table.clone"
local encode_args = ngx.encode_args
local tostring = tostring
local assert = assert
local ipairs = ipairs
local lazy_teardown = lazy_teardown
local before_each = before_each
local after_each = after_each
local lazy_setup = lazy_setup
local describe = describe
local it = it
local HOST = helpers.mock_upstream_host .. ":" .. helpers.mock_upstream_port
local function get_parameters(n)
local query = {}
for i = 1, n do
query["a" .. i] = "v" .. i
end
local body = encode_args(query)
local headers = clone(query)
headers["a1"] = nil
headers["a2"] = nil
headers["a3"] = nil
headers["a4"] = nil
headers["content-length"] = tostring(#body)
headers["content-type"] = "application/x-www-form-urlencoded"
headers["user-agent"] = "kong"
headers["host"] = HOST
return {
query = query,
headers = headers,
body = body,
}
end
local function get_response_headers(n)
local headers = {}
for i = 1, n - 2 do
headers["a" .. i] = "v" .. i
end
headers["content-length"] = "0"
headers["connection"] = "keep-alive"
return headers
end
local function validate(client_args_count, params, body, headers)
assert.is.equal(client_args_count, body.client_args_count)
assert.same(params.query, body.kong.uri_args)
assert.same(params.query, body.ngx.uri_args)
assert.same(params.headers, body.kong.request_headers)
assert.same(params.headers, body.ngx.request_headers)
local response_headers = get_response_headers(client_args_count)
assert.same(response_headers, body.kong.response_headers)
assert.same(response_headers, body.ngx.response_headers)
headers["Content-Length"] = nil
headers["Connection"] = nil
headers["Content-Type"] = nil
headers["Date"] = nil
headers["Server"] = nil
headers["X-Kong-Response-Latency"] = nil
response_headers["content-length"] = nil
response_headers["connection"] = nil
assert.same(response_headers, headers)
assert.same(params.query, body.kong.post_args)
assert.same(params.query, body.ngx.post_args)
assert.logfile().has.no.line("request headers truncated", true, 0.5)
assert.logfile().has.no.line("uri args truncated", true, 0.1)
assert.logfile().has.no.line("post args truncated", true, 0.1)
assert.logfile().has.no.line("response headers truncated", true, 0.1)
end
local function validate_truncated(client_args_count, params, body, headers)
assert.is.equal(client_args_count, body.client_args_count)
assert.is_not.same(params.query, body.kong.uri_args)
assert.is_not.same(params.query, body.ngx.uri_args)
assert.is_not.same(params.headers, body.kong.request_headers)
assert.is_not.same(params.headers, body.ngx.request_headers)
assert.is_not.same(get_response_headers(client_args_count), body.kong.response_headers)
assert.is_not.same(get_response_headers(client_args_count), body.ngx.response_headers)
local response_headers = get_response_headers(client_args_count)
headers["Content-Length"] = nil
headers["Connection"] = nil
headers["Content-Type"] = nil
headers["Date"] = nil
headers["Server"] = nil
headers["X-Kong-Response-Latency"] = nil
response_headers["content-length"] = nil
response_headers["connection"] = nil
assert.same(response_headers, headers)
assert.is_not.same(params.query, body.kong.post_args)
assert.is_not.same(params.query, body.ngx.post_args)
assert.logfile().has.line("request headers truncated", true, 0.5)
assert.logfile().has.line("uri args truncated", true, 0.1)
assert.logfile().has.line("post args truncated", true, 0.1)
assert.logfile().has.line("response headers truncated", true, 0.1)
end
local function validate_proxy(params, body, truncated)
assert.same(params.query, body.uri_args)
local request_headers = body.headers
request_headers["connection"] = nil
request_headers["x-forwarded-for"] = nil
request_headers["x-forwarded-host"] = nil
request_headers["x-forwarded-path"] = nil
request_headers["x-forwarded-port"] = nil
request_headers["x-forwarded-prefix"] = nil
request_headers["x-forwarded-proto"] = nil
request_headers["x-real-ip"] = nil
request_headers["via"] = nil
assert.same(params.headers, request_headers)
assert.same(params.query, body.uri_args)
assert.same(params.query, body.post_data.params)
if truncated then
assert.logfile().has.line("truncated", true, 0.5)
else
assert.logfile().has.no.line("truncated", true, 0.5)
end
end
for _, strategy in helpers.each_strategy() do
for _, n in ipairs({ 50, 100, 200 }) do
describe("max args [#" .. strategy .. "] (" .. n .. " parameters)", function()
local client
lazy_setup(function()
local bp = helpers.get_db_utils(strategy, {
"plugins",
"routes",
"services",
}, {
"max-args"
})
local service = assert(bp.services:insert({
url = helpers.mock_upstream_url
}))
bp.routes:insert({
service = service,
paths = { "/proxy" }
})
local route = bp.routes:insert({
paths = { "/max-args" }
})
assert(bp.plugins:insert({
name = "max-args",
route = { id = route.id },
}))
helpers.start_kong({
database = strategy,
plugins = "bundled, max-args",
nginx_conf = "spec/fixtures/custom_nginx.template",
lua_max_resp_headers = n ~= 100 and n or nil,
lua_max_req_headers = n ~= 100 and n or nil,
lua_max_uri_args = n ~= 100 and n or nil,
lua_max_post_args = n ~= 100 and n or nil,
log_level = "debug",
headers_upstream = "off",
headers = "off"
})
end)
lazy_teardown(function()
helpers.stop_kong()
end)
before_each(function()
helpers.clean_logfile()
client = helpers.proxy_client()
end)
after_each(function()
if client then
client:close()
end
end)
it("no truncation when using " .. n .. " parameters", function()
local params = get_parameters(n)
local res = client:post("/max-args", params)
assert.response(res).has.status(200)
local body = assert.response(res).has.jsonbody()
validate(n, params, body, res.headers)
end)
it("truncation when using " .. n + 1 .. " parameters", function()
local params = get_parameters(n + 1)
local res = client:post("/max-args", params)
assert.response(res).has.status(200)
local body = assert.response(res).has.jsonbody()
validate_truncated(n + 1, params, body, res.headers)
end)
it("no truncation when using " .. n .. " parameters when proxying", function()
local params = get_parameters(n)
local res = client:post("/proxy", params)
assert.response(res).has.status(200)
local body = assert.response(res).has.jsonbody()
validate_proxy(params, body, false)
end)
it("no truncation when using " .. n + 1 .. " parameters when proxying", function()
local params = get_parameters(n + 1)
local res = client:post("/proxy", params)
assert.response(res).has.status(200)
local body = assert.response(res).has.jsonbody()
validate_proxy(params, body, true)
end)
end)
end
end