kong/spec/03-plugins/14-request-termination/02-access_spec.lua (383 lines of code) (raw):

local helpers = require "spec.helpers" local cjson = require "cjson" local meta = require "kong.meta" local server_tokens = meta._SERVER_TOKENS for _, strategy in helpers.each_strategy() do describe("Plugin: request-termination (access) [#" .. strategy .. "]", function() local proxy_client local admin_client lazy_setup(function() local bp, db = helpers.get_db_utils(strategy, { "routes", "services", "plugins", }) local route1 = bp.routes:insert({ hosts = { "api1.request-termination.com" }, }) local route2 = bp.routes:insert({ hosts = { "api2.request-termination.com" }, }) local route3 = bp.routes:insert({ hosts = { "api3.request-termination.com" }, }) local route4 = bp.routes:insert({ hosts = { "api4.request-termination.com" }, }) local route5 = bp.routes:insert({ hosts = { "api5.request-termination.com" }, }) local route6 = bp.routes:insert({ hosts = { "api6.request-termination.com" }, }) local route7 = db.routes:insert({ hosts = { "api7.request-termination.com" }, }) local route8 = bp.routes:insert({ hosts = { "api8.request-termination.com" }, }) local route9 = bp.routes:insert({ hosts = { "api9.request-termination.com" }, }) local route10 = bp.routes:insert({ hosts = { "api10.request-termination.com" }, }) bp.plugins:insert { name = "request-termination", route = { id = route1.id }, config = {}, } bp.plugins:insert { name = "request-termination", route = { id = route2.id }, config = { status_code = 404, }, } bp.plugins:insert { name = "request-termination", route = { id = route3.id }, config = { status_code = 406, message = "Invalid", }, } bp.plugins:insert { name = "request-termination", route = { id = route4.id }, config = { body = "<html><body><h1>Service is down for maintenance</h1></body></html>", }, } bp.plugins:insert { name = "request-termination", route = { id = route5.id }, config = { status_code = 451, content_type = "text/html", body = "<html><body><h1>Service is down due to content infringement</h1></body></html>", }, } bp.plugins:insert { name = "request-termination", route = { id = route6.id }, config = { status_code = 503, body = '{"code": 1, "message": "Service unavailable"}', }, } bp.plugins:insert { name = "request-termination", route = { id = route7.id }, config = {}, } bp.plugins:insert { name = "request-termination", route = { id = route8.id }, config = { status_code = 204 }, } bp.plugins:insert { name = "request-termination", route = { id = route9.id }, config = { echo = true, status_code = 404 }, } bp.plugins:insert { name = "request-termination", route = { id = route10.id }, config = { echo = true, trigger = "gimme-an-echo", status_code = 404 }, } local route_grpc_1 = assert(bp.routes:insert { protocols = { "grpc" }, paths = { "/hello.HelloService/" }, service = assert(bp.services:insert { name = "grpc", url = helpers.grpcbin_url, }), }) bp.plugins:insert { name = "request-termination", route = { id = route_grpc_1.id }, config = { status_code = 503, }, } assert(helpers.start_kong({ database = strategy, nginx_conf = "spec/fixtures/custom_nginx.template", })) end) lazy_teardown(function() helpers.stop_kong() end) before_each(function() proxy_client = helpers.proxy_client() admin_client = helpers.admin_client() end) after_each(function() if proxy_client then proxy_client:close() end if admin_client then admin_client:close() end end) describe("status code and message", function() it("default status code and message", function() local res = assert(proxy_client:send { method = "GET", path = "/status/200", headers = { ["Host"] = "api1.request-termination.com" } }) local body = assert.res_status(503, res) local json = cjson.decode(body) assert.same({ message = "Service unavailable" }, json) end) it("default status code and message with serviceless route", function() local res = assert(proxy_client:send { method = "GET", path = "/status/200", headers = { ["Host"] = "api7.request-termination.com" } }) local body = assert.res_status(503, res) local json = cjson.decode(body) assert.same({ message = "Service unavailable" }, json) end) it("status code with default message", function() local res = assert(proxy_client:send { method = "GET", path = "/status/200", headers = { ["Host"] = "api2.request-termination.com" } }) local body = assert.res_status(404, res) local json = cjson.decode(body) assert.same({ message = "Not found" }, json) end) it("status code with custom message", function() local res = assert(proxy_client:send { method = "GET", path = "/status/200", headers = { ["Host"] = "api3.request-termination.com" } }) local body = assert.res_status(406, res) local json = cjson.decode(body) assert.same({ message = "Invalid" }, json) end) it("returns 204 without content length header", function() local res = assert(proxy_client:send { method = "GET", path = "/status/204", headers = { ["Host"] = "api8.request-termination.com" } }) assert.res_status(204, res) assert.is_nil(res.headers["Content-Length"]) end) end) describe("status code and body", function() it("default status code and body", function() local res = assert(proxy_client:send { method = "GET", path = "/status/200", headers = { ["Host"] = "api4.request-termination.com" } }) local body = assert.res_status(503, res) assert.equal([[<html><body><h1>Service is down for maintenance</h1></body></html>]], body) end) it("status code with default message", function() local res = assert(proxy_client:send { method = "GET", path = "/status/200", headers = { ["Host"] = "api5.request-termination.com" } }) local body = assert.res_status(451, res) assert.equal([[<html><body><h1>Service is down due to content infringement</h1></body></html>]], body) end) it("status code with default message #grpc", function() local ok, res = helpers.proxy_client_grpc(){ service = "hello.HelloService.SayHello", opts = { ["-v"] = true, }, } assert.falsy(ok) assert.matches("Code: Unavailable", res) end) it("status code with custom message", function() local res = assert(proxy_client:send { method = "GET", path = "/status/200", headers = { ["Host"] = "api6.request-termination.com" } }) local body = assert.res_status(503, res) local json = cjson.decode(body) assert.same({ code = 1, message = "Service unavailable" }, json) end) end) it("returns server tokens with Server header", function() local res = assert(proxy_client:send { method = "GET", path = "/status/200", headers = { ["Host"] = "api1.request-termination.com" } }) assert.equal(server_tokens, res.headers["Server"]) end) describe("echo & trigger", function() it("echos a request if no trigger is set", function() local res = assert(proxy_client:send { method = "GET", query = { hello = "there", }, path = "/status/200", headers = { ["Host"] = "api9.request-termination.com" }, body = "cool body", }) assert.response(res).has.status(404) local json = assert.response(res).has.jsonbody() assert.equal("api9.request-termination.com", json.matched_route.hosts[1]) json.request.headers["user-agent"] = nil -- clear, depends on lua-resty-http version assert.same({ headers = { ["content-length"] = '9', host = 'api9.request-termination.com', }, host = 'api9.request-termination.com', method = 'GET', path = '/status/200', port = helpers.get_proxy_port(), query = { hello = 'there', }, raw_body = 'cool body', scheme = 'http', }, json.request) end) it("doesn't echo a request if the trigger is set but not specified", function() local res = assert(proxy_client:send { method = "GET", path = "/status/200", headers = { ["Host"] = "api10.request-termination.com" } }) assert.response(res).has.status(200) end) it("echos a request if the trigger is specified as a header", function() local res = assert(proxy_client:send { method = "GET", query = { hello = "there", }, path = "/status/200", headers = { ["Host"] = "api10.request-termination.com", ["Gimme-An-Echo"] = "anything will do" }, body = "cool body", }) assert.response(res).has.status(404) local json = assert.response(res).has.jsonbody() assert.equal("api10.request-termination.com", json.matched_route.hosts[1]) json.request.headers["user-agent"] = nil -- clear, depends on lua-resty-http version assert.same({ headers = { ["content-length"] = '9', ["gimme-an-echo"] = 'anything will do', host = 'api10.request-termination.com', }, host = 'api10.request-termination.com', method = 'GET', path = '/status/200', port = helpers.get_proxy_port(), query = { hello = 'there', }, raw_body = 'cool body', scheme = 'http', }, json.request) end) it("echos a request if the trigger is specified as a query parameter", function() local res = assert(proxy_client:send { method = "GET", query = { hello = "there", ["gimme-an-echo"] = "anything will do" }, path = "/status/200", headers = { ["Host"] = "api10.request-termination.com", }, body = "cool body", }) assert.response(res).has.status(404) local json = assert.response(res).has.jsonbody() assert.equal("api10.request-termination.com", json.matched_route.hosts[1]) json.request.headers["user-agent"] = nil -- clear, depends on lua-resty-http version assert.same({ headers = { ["content-length"] = '9', host = 'api10.request-termination.com', }, host = 'api10.request-termination.com', method = 'GET', path = '/status/200', port = helpers.get_proxy_port(), query = { hello = 'there', ["gimme-an-echo"] = 'anything will do', }, raw_body = 'cool body', scheme = 'http', }, json.request) end) end) end) end