Files
kong--kong/spec/02-integration/05-proxy/33-request-id-header_spec.lua
2026-07-13 12:32:21 +08:00

334 lines
8.4 KiB
Lua

local helpers = require "spec.helpers"
local constants = require "kong.constants"
local cjson = require "cjson"
local function setup_db()
local bp = helpers.get_db_utils(nil, {
"routes",
"services",
"plugins",
})
local service = bp.services:insert {
host = helpers.mock_upstream_host,
port = helpers.mock_upstream_port,
protocol = helpers.mock_upstream_protocol,
}
bp.routes:insert {
protocols = { "http" },
hosts = { "request_id" },
service = service,
}
local route_post_func = bp.routes:insert {
protocols = { "http" },
hosts = { "post-function-access" },
service = service,
}
bp.plugins:insert {
name = "post-function",
route = route_post_func,
config = { access = {
"ngx.req.set_header('" .. constants.HEADERS.REQUEST_ID .. "', 'overwritten')"
}}
}
local route_post_func_2 = bp.routes:insert {
protocols = { "http" },
hosts = { "post-function-header-filter" },
service = service,
}
bp.plugins:insert {
name = "post-function",
route = route_post_func_2,
config = { header_filter = {
"ngx.header['" .. constants.HEADERS.REQUEST_ID .. "'] = 'overwritten'"
}}
}
end
describe(constants.HEADERS.REQUEST_ID .. " header", function()
local client
describe("(downstream)", function()
describe("with default configuration", function()
lazy_setup(function()
setup_db()
assert(helpers.start_kong {
nginx_conf = "spec/fixtures/custom_nginx.template",
plugins = "bundled",
})
client = helpers.proxy_client()
end)
lazy_teardown(function()
if client then
client:close()
end
helpers.stop_kong()
end)
it("contains the expected value", function()
local res = assert(client:send {
method = "GET",
path = "/",
headers = {
host = "request_id",
}
})
assert.res_status(200, res)
assert.matches("^[0-9a-f]+$", res.headers[constants.HEADERS.REQUEST_ID])
end)
it("should be populated when no API matched", function()
local res = assert(client:send {
method = "GET",
path = "/",
headers = {
host = "404.test",
}
})
local body = assert.res_status(404, res)
body = cjson.decode(body)
assert.matches(body.message, "no Route matched with those values")
assert.matches("^[0-9a-f]+$", res.headers[constants.HEADERS.REQUEST_ID])
end)
it("overwrites value set by plugin", function()
local res = assert(client:send {
method = "GET",
path = "/",
headers = {
host = "post-function-header-filter",
}
})
assert.res_status(200, res)
local downstream_header = res.headers[constants.HEADERS.REQUEST_ID]
assert.not_nil(downstream_header)
assert.matches("^[0-9a-f]+$", downstream_header)
assert.not_equal("overwritten", downstream_header)
end)
end)
describe("with configuration [headers=X-Kong-Request-Id]", function()
lazy_setup(function()
setup_db()
assert(helpers.start_kong {
nginx_conf = "spec/fixtures/custom_nginx.template",
headers = "X-Kong-Request-Id",
})
client = helpers.proxy_client()
end)
lazy_teardown(function()
if client then
client:close()
end
helpers.stop_kong()
end)
it("contains the expected value", function()
local res = assert(client:send {
method = "GET",
path = "/",
headers = {
host = "request_id",
}
})
assert.res_status(200, res)
assert.matches("^[0-9a-f]+$", res.headers[constants.HEADERS.REQUEST_ID])
end)
end)
describe("is not injected with configuration [headers=off]", function()
lazy_setup(function()
setup_db()
assert(helpers.start_kong {
nginx_conf = "spec/fixtures/custom_nginx.template",
headers = "off",
})
client = helpers.proxy_client()
end)
lazy_teardown(function()
if client then
client:close()
end
helpers.stop_kong()
end)
it("is nil", function()
local res = assert(client:send {
method = "GET",
path = "/",
headers = {
host = "request_id",
}
})
assert.res_status(200, res)
assert.is_nil(res.headers[constants.HEADERS.REQUEST_ID])
end)
end)
end)
describe("(upstream)", function()
describe("default configuration", function()
lazy_setup(function()
setup_db()
assert(helpers.start_kong {
nginx_conf = "spec/fixtures/custom_nginx.template",
plugins = "bundled",
})
client = helpers.proxy_client()
end)
lazy_teardown(function()
if client then
client:close()
end
helpers.stop_kong()
end)
it("contains the expected value", function()
local res = assert(client:send {
method = "GET",
path = "/anything",
headers = {
host = "request_id",
}
})
local body = assert.res_status(200, res)
body = cjson.decode(body)
assert.matches("^[0-9a-f]+$", body.headers[string.lower(constants.HEADERS.REQUEST_ID)])
end)
it("overwrites client value if any", function()
local client_header_value = "client_value"
local res = assert(client:send {
method = "GET",
path = "/anything",
headers = {
host = "request_id",
["X-Kong-Request-Id"] = client_header_value
}
})
local body = assert.res_status(200, res)
body = cjson.decode(body)
local upstream_received_header = body.headers[string.lower(constants.HEADERS.REQUEST_ID)]
assert.matches("^[0-9a-f]+$", upstream_received_header)
assert.not_equal(client_header_value, upstream_received_header)
end)
it("overwrites value set by plugin", function()
local res = assert(client:send {
method = "GET",
path = "/",
headers = {
host = "post-function-access",
}
})
local body = assert.res_status(200, res)
body = cjson.decode(body)
local upstream_received_header = body.headers[string.lower(constants.HEADERS.REQUEST_ID)]
assert.matches("^[0-9a-f]+$", upstream_received_header)
assert.not_equal("overwritten", upstream_received_header)
end)
end)
describe("is injected with configuration [headers=X-Kong-Request-Id]", function()
lazy_setup(function()
setup_db()
assert(helpers.start_kong {
nginx_conf = "spec/fixtures/custom_nginx.template",
headers_upstream = "X-Kong-Request-Id",
})
client = helpers.proxy_client()
end)
lazy_teardown(function()
if client then
client:close()
end
helpers.stop_kong()
end)
it("contains the expected value", function()
local res = assert(client:send {
method = "GET",
path = "/",
headers = {
host = "request_id",
}
})
local body = assert.res_status(200, res)
body = cjson.decode(body)
assert.matches("^[0-9a-f]+$", body.headers[string.lower(constants.HEADERS.REQUEST_ID)])
end)
end)
describe("is not injected with configuration [headers=off]", function()
lazy_setup(function()
setup_db()
assert(helpers.start_kong {
nginx_conf = "spec/fixtures/custom_nginx.template",
headers_upstream = "off",
})
client = helpers.proxy_client()
end)
lazy_teardown(function()
if client then
client:close()
end
helpers.stop_kong()
end)
it("is nil", function()
local res = assert(client:send {
method = "GET",
path = "/",
headers = {
host = "request_id",
}
})
local body = assert.res_status(200, res)
body = cjson.decode(body)
assert.is_nil(body.headers[string.lower(constants.HEADERS.REQUEST_ID)])
end)
end)
end)
end)