kong/spec/02-integration/05-proxy/15-upstream-status-header_spec.lua (164 lines of code) (raw):
local helpers = require "spec.helpers"
local constants = require "kong.constants"
local function setup_db()
local bp = helpers.get_db_utils(nil, {
"routes",
"services",
"plugins",
"keyauth_credentials",
})
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" },
paths = { "/status/200" },
service = service,
}
local route2 = bp.routes:insert {
protocols = { "http" },
paths = { "/status/plugin-changes-200-to-500" },
service = service,
}
bp.plugins:insert {
name = "dummy",
route = { id = route2.id },
config = {
resp_code = 500,
}
}
local route3 = bp.routes:insert {
protocols = { "http" },
paths = { "/status/non-proxied-request" },
service = service,
}
bp.plugins:insert {
name = "key-auth",
route = { id = route3.id },
}
end
describe(constants.HEADERS.UPSTREAM_STATUS .. " header", function()
local client
describe("should be same as upstream status code", function()
lazy_setup(function()
setup_db()
assert(helpers.start_kong {
nginx_conf = "spec/fixtures/custom_nginx.template",
headers = "server_tokens,latency_tokens,x-kong-upstream-status",
plugins = "bundled,dummy",
})
client = helpers.proxy_client()
end)
lazy_teardown(function()
if client then
client:close()
end
helpers.stop_kong()
end)
it("when no plugin changes status code", function()
local res = assert(client:send {
method = "GET",
path = "/status/200",
headers = {
host = helpers.mock_upstream_host,
}
})
assert.res_status(200, res)
assert.equal("200", res.headers[constants.HEADERS.UPSTREAM_STATUS])
end)
it("when a plugin changes status code", function()
local res = assert(client:send {
method = "GET",
host = helpers.mock_upstream_host,
path = "/status/plugin-changes-200-to-500",
headers = {
["Host"] = helpers.mock_upstream_host,
}
})
assert.res_status(500, res)
assert.equal("200", res.headers[constants.HEADERS.UPSTREAM_STATUS])
end)
end)
describe("is not injected with default configuration", function()
lazy_setup(function()
setup_db()
assert(helpers.start_kong {
nginx_conf = "spec/fixtures/custom_nginx.template",
})
end)
lazy_teardown(function()
if client then
client:close()
end
helpers.stop_kong()
end)
it("", function()
local client = helpers.proxy_client()
local res = assert(client:send {
method = "GET",
path = "/status/200",
headers = {
host = helpers.mock_upstream_host,
}
})
assert.res_status(200, res)
assert.is_nil(res.headers[constants.HEADERS.UPSTREAM_STATUS])
end)
end)
describe("is injected with configuration [headers=X-Kong-Upstream-Status]", function()
lazy_setup(function()
setup_db()
assert(helpers.start_kong {
nginx_conf = "spec/fixtures/custom_nginx.template",
headers = "X-Kong-Upstream-Status",
})
end)
lazy_teardown(function()
if client then
client:close()
end
helpers.stop_kong()
end)
it("", function()
local client = helpers.proxy_client()
local res = assert(client:send {
method = "GET",
path = "/status/200",
headers = {
host = helpers.mock_upstream_host,
}
})
assert.res_status(200, res)
assert("200", res.headers[constants.HEADERS.UPSTREAM_STATUS])
end)
end)
describe("short-circuited requests", function()
lazy_setup(function()
setup_db()
assert(helpers.start_kong {
nginx_conf = "spec/fixtures/custom_nginx.template",
headers = "X-Kong-Upstream-Status",
})
end)
lazy_teardown(function()
if client then
client:close()
end
helpers.stop_kong()
end)
it("empty when rejected by authentication plugin", function()
-- Added as a regression test during the merge of this patch to ensure
-- the logic in the header_filter phase is defensive enough.
-- As a result, the logic was moved within the `if proxied` branch.
local client = helpers.proxy_client()
local res = assert(client:send {
method = "GET",
path = "/status/non-proxied-request",
headers = {
host = helpers.mock_upstream_host,
}
})
assert.res_status(401, res)
assert.is_nil(res.headers[constants.HEADERS.UPSTREAM_STATUS])
end)
end)
end)