local helpers = require "spec.helpers" local fixtures = require "spec.fixtures.aws-lambda" for _, strategy in helpers.each_strategy() do describe("[AWS Lambda] request-util [#" .. strategy .. "]", function() local proxy_client local admin_client lazy_setup(function() local bp, db = helpers.get_db_utils(strategy, { "routes", "services", "plugins", }, { "aws-lambda" }) local route1 = bp.routes:insert { hosts = { "gw.skipfile.test" }, } bp.plugins:insert { name = "aws-lambda", route = { id = route1.id }, config = { port = 10001, aws_key = "mock-key", aws_secret = "mock-secret", aws_region = "us-east-1", function_name = "kongLambdaTest", awsgateway_compatible = true, forward_request_body = true, skip_large_bodies = true, }, } local route2 = bp.routes:insert { hosts = { "gw.readfile.test" }, } bp.plugins:insert { name = "aws-lambda", route = { id = route2.id }, config = { port = 10001, aws_key = "mock-key", aws_secret = "mock-secret", aws_region = "us-east-1", function_name = "kongLambdaTest", awsgateway_compatible = true, forward_request_body = true, skip_large_bodies = false, }, } local route3 = bp.routes:insert { hosts = { "plain.skipfile.test" }, } bp.plugins:insert { name = "aws-lambda", route = { id = route3.id }, config = { port = 10001, aws_key = "mock-key", aws_secret = "mock-secret", aws_region = "us-east-1", function_name = "kongLambdaTest", awsgateway_compatible = false, forward_request_body = true, skip_large_bodies = true, }, } local route4 = bp.routes:insert { hosts = { "plain.readfile.test" }, } bp.plugins:insert { name = "aws-lambda", route = { id = route4.id }, config = { port = 10001, aws_key = "mock-key", aws_secret = "mock-secret", aws_region = "us-east-1", function_name = "kongLambdaTest", awsgateway_compatible = false, forward_request_body = true, skip_large_bodies = false, }, } local route5 = bp.routes:insert { hosts = { "base.sixtyfour.test" }, } bp.plugins:insert { name = "aws-lambda", route = { id = route5.id }, config = { port = 10001, aws_key = "mock-key", aws_secret = "mock-secret", aws_region = "us-east-1", function_name = "kongLambdaTest", awsgateway_compatible = false, forward_request_body = true, skip_large_bodies = false, --base64_encode_body = true, }, } local route6 = bp.routes:insert { hosts = { "notbase.sixtyfour.test" }, } bp.plugins:insert { name = "aws-lambda", route = { id = route6.id }, config = { port = 10001, aws_key = "mock-key", aws_secret = "mock-secret", aws_region = "us-east-1", function_name = "kongLambdaTest", awsgateway_compatible = false, forward_request_body = true, skip_large_bodies = false, base64_encode_body = false, }, } local route7 = db.routes:insert { hosts = { "gw.serviceless.test" }, } db.plugins:insert { name = "aws-lambda", route = { id = route7.id }, config = { port = 10001, aws_key = "mock-key", aws_secret = "mock-secret", aws_region = "us-east-1", function_name = "kongLambdaTest", awsgateway_compatible = true, forward_request_body = true, skip_large_bodies = true, }, } assert(helpers.start_kong({ database = strategy, plugins = "aws-lambda", nginx_conf = "spec/fixtures/custom_nginx.template", }, nil, nil, fixtures)) end) before_each(function() proxy_client = helpers.proxy_client() admin_client = helpers.admin_client() local shell = require "resty.shell" shell.run(":> " .. helpers.test_conf.nginx_err_logs, nil, 0) -- clean log files end) after_each(function () proxy_client:close() admin_client:close() end) lazy_teardown(function() helpers.stop_kong() end) describe("plain:", function() -- plain serialization, not AWS gateway compatible describe("when skip_large_bodies is true", function() it("it skips file-buffered body > max buffer size", function() local request_body = ("a"):rep(32 * 1024) -- 32 kb local res = assert(proxy_client:send { method = "GET", path = "/get?key1=some_value1&key2=some_value2&key3=some_value3", headers = { ["Host"] = "plain.skipfile.test" }, body = request_body }) assert.response(res).has.status(200, res) local body = assert.response(res).has.jsonbody() assert.is_string(res.headers["x-amzn-RequestId"]) assert.equal("", body.request_body) -- empty because it was skipped assert.logfile().has.line("request body was buffered to disk, too large", true) end) it("it reads body < max buffer size", function() local request_body = ("a"):rep(1 * 1024) -- 1 kb local res = assert(proxy_client:send { method = "GET", path = "/get?key1=some_value1&key2=some_value2&key3=some_value3", headers = { ["Host"] = "plain.skipfile.test" }, body = request_body, }) assert.response(res).has.status(200, res) local body = assert.response(res).has.jsonbody() assert.is_string(res.headers["x-amzn-RequestId"]) assert.equal(ngx.encode_base64(request_body), body.request_body) -- matches because it was small enough assert.logfile().has.no.line("request body was buffered to disk, too large", true) end) end) describe("when skip_large_bodies is false", function() it("it reads file-buffered body > max buffer size", function() local request_body = ("a"):rep(32 * 1024) -- 32 kb local res = assert(proxy_client:send { method = "GET", path = "/get?key1=some_value1&key2=some_value2&key3=some_value3", headers = { ["Host"] = "plain.readfile.test" }, body = request_body }) assert.response(res).has.status(200, res) local body = assert.response(res).has.jsonbody() assert.is_string(res.headers["x-amzn-RequestId"]) assert.equal(ngx.encode_base64(request_body), body.request_body) -- matches because it was read from file assert.logfile().has.no.line("request body was buffered to disk, too large", true) end) it("it reads body < max buffer size", function() local request_body = ("a"):rep(1 * 1024) -- 1 kb local res = assert(proxy_client:send { method = "GET", path = "/get?key1=some_value1&key2=some_value2&key3=some_value3", headers = { ["Host"] = "plain.readfile.test" }, body = request_body, }) assert.response(res).has.status(200, res) local body = assert.response(res).has.jsonbody() assert.is_string(res.headers["x-amzn-RequestId"]) assert.equal(ngx.encode_base64(request_body), body.request_body) -- matches because it was small enough assert.logfile().has.no.line("request body was buffered to disk, too large", true) end) end) end) describe("aws-gw:", function() -- AWS gateway compatible serialization describe("when skip_large_bodies is true", function() it("it skips file-buffered body > max buffer size", function() local request_body = ("a"):rep(32 * 1024) -- 32 kb local res = assert(proxy_client:send { method = "GET", path = "/get?key1=some_value1&key2=some_value2&key3=some_value3", headers = { ["Host"] = "gw.skipfile.test" }, body = request_body }) assert.response(res).has.status(200, res) local body = assert.response(res).has.jsonbody() assert.is_string(res.headers["x-amzn-RequestId"]) assert.equal("", body.body) -- empty because it was skipped assert.logfile().has.line("request body was buffered to disk, too large", true) end) it("it reads body < max buffer size", function() local request_body = ("a"):rep(1 * 1024) -- 1 kb local res = assert(proxy_client:send { method = "GET", path = "/get?key1=some_value1&key2=some_value2&key3=some_value3", headers = { ["Host"] = "gw.skipfile.test" }, body = request_body, }) assert.response(res).has.status(200, res) local body = assert.response(res).has.jsonbody() assert.is_string(res.headers["x-amzn-RequestId"]) assert.equal(ngx.encode_base64(request_body), body.body) -- matches because it was small enough assert.logfile().has.no.line("request body was buffered to disk, too large", true) end) end) describe("when skip_large_bodies is false", function() it("it reads file-buffered body > max buffer size", function() local request_body = ("a"):rep(32 * 1024) -- 32 kb local res = assert(proxy_client:send { method = "GET", path = "/get?key1=some_value1&key2=some_value2&key3=some_value3", headers = { ["Host"] = "gw.readfile.test" }, body = request_body }) assert.response(res).has.status(200, res) local body = assert.response(res).has.jsonbody() assert.is_string(res.headers["x-amzn-RequestId"]) assert.equal(ngx.encode_base64(request_body), body.body) -- matches because it was read from file assert.logfile().has.no.line("request body was buffered to disk, too large", true) end) it("it reads body < max buffer size", function() local request_body = ("a"):rep(1 * 1024) -- 1 kb local res = assert(proxy_client:send { method = "GET", path = "/get?key1=some_value1&key2=some_value2&key3=some_value3", headers = { ["Host"] = "gw.readfile.test" }, body = request_body, }) assert.response(res).has.status(200, res) local body = assert.response(res).has.jsonbody() assert.is_string(res.headers["x-amzn-RequestId"]) assert.equal(ngx.encode_base64(request_body), body.body) -- matches because it was small enough assert.logfile().has.no.line("request body was buffered to disk, too large", true) end) end) end) describe("base64 body encoding", function() it("enabled", function() local request_body = ("encodemeplease") local res = assert(proxy_client:send { method = "GET", path = "/get?key1=some_value1&key2=some_value2&key3=some_value3", headers = { ["Host"] = "base.sixtyfour.test" }, body = request_body, }) assert.response(res).has.status(200, res) local body = assert.response(res).has.jsonbody() assert.equal(ngx.encode_base64(request_body), body.request_body) end) it("disabled", function() local request_body = ("donotencodemeplease") local res = assert(proxy_client:send { method = "GET", path = "/get?key1=some_value1&key2=some_value2&key3=some_value3", headers = { ["Host"] = "notbase.sixtyfour.test" }, body = request_body, }) assert.response(res).has.status(200, res) local body = assert.response(res).has.jsonbody() assert.equal(request_body, body.request_body) end) end) describe("serviceless plugin", function() it("serviceless", function() local request_body = ("encodemeplease") local res = assert(proxy_client:send { method = "GET", path = "/get?key1=some_value1&key2=some_value2&key3=some_value3", headers = { ["Host"] = "gw.serviceless.test" }, body = request_body, }) assert.response(res).has.status(200, res) assert.is_string(res.headers["x-amzn-RequestId"]) end) end) end) end