146 lines
5.7 KiB
Lua
146 lines
5.7 KiB
Lua
local helpers = require "spec.helpers"
|
|
|
|
local fixtures = {
|
|
dns_mock = helpers.dns_mock.new(),
|
|
http_mock = {
|
|
lambda_plugin = [[
|
|
|
|
server {
|
|
server_name mock_aws_lambda;
|
|
listen 10001 ssl;
|
|
> if ssl_cert[1] then
|
|
> for i = 1, #ssl_cert do
|
|
ssl_certificate $(ssl_cert[i]);
|
|
ssl_certificate_key $(ssl_cert_key[i]);
|
|
> end
|
|
> else
|
|
ssl_certificate ${{SSL_CERT}};
|
|
ssl_certificate_key ${{SSL_CERT_KEY}};
|
|
> end
|
|
ssl_protocols TLSv1.2 TLSv1.3;
|
|
|
|
location ~ "/2015-03-31/functions/(?:[^/])*/invocations" {
|
|
content_by_lua_block {
|
|
local function x()
|
|
local function say(res, status)
|
|
ngx.header["x-amzn-RequestId"] = "foo"
|
|
|
|
if string.match(ngx.var.uri, "functionWithUnhandledError") then
|
|
ngx.header["X-Amz-Function-Error"] = "Unhandled"
|
|
end
|
|
|
|
ngx.status = status
|
|
|
|
if string.match(ngx.var.uri, "functionWithBadJSON") then
|
|
local badRes = "{\"foo\":\"bar\""
|
|
ngx.header["Content-Length"] = #badRes + 1
|
|
ngx.say(badRes)
|
|
|
|
elseif string.match(ngx.var.uri, "functionWithNoResponse") then
|
|
ngx.header["Content-Length"] = 0
|
|
|
|
elseif string.match(ngx.var.uri, "functionWithBase64EncodedResponse") then
|
|
ngx.header["Content-Type"] = "application/json"
|
|
ngx.say("{\"statusCode\": 200, \"body\": \"dGVzdA==\", \"isBase64Encoded\": true}")
|
|
|
|
elseif string.match(ngx.var.uri, "functionWithNotBase64EncodedResponse") then
|
|
ngx.header["Content-Type"] = "application/json"
|
|
ngx.say("{\"statusCode\": 200, \"body\": \"dGVzdA=\", \"isBase64Encoded\": false}")
|
|
|
|
elseif string.match(ngx.var.uri, "functionWithIllegalBase64EncodedResponse") then
|
|
ngx.say("{\"statusCode\": 200, \"body\": \"dGVzdA=\", \"isBase64Encoded\": \"abc\"}")
|
|
|
|
elseif string.match(ngx.var.uri, "functionWithMultiValueHeadersResponse") then
|
|
ngx.header["Content-Type"] = "application/json"
|
|
ngx.say("{\"statusCode\": 200, \"headers\": { \"Age\": \"3600\"}, \"multiValueHeaders\": {\"Access-Control-Allow-Origin\": [\"site1.com\", \"site2.com\"]}}")
|
|
|
|
elseif string.match(ngx.var.uri, "functionEcho") then
|
|
require("spec.fixtures.mock_upstream").send_default_json_response()
|
|
|
|
elseif string.match(ngx.var.uri, "functionWithTransferEncodingHeader") then
|
|
ngx.say("{\"statusCode\": 200, \"headers\": { \"Transfer-Encoding\": \"chunked\", \"transfer-encoding\": \"chunked\"}}")
|
|
|
|
elseif string.match(ngx.var.uri, "functionWithLatency") then
|
|
-- additional latency
|
|
ngx.sleep(2)
|
|
ngx.say("{\"statusCodge\": 200, \"body\": \"dGVzdA=\", \"isBase64Encoded\": false}")
|
|
|
|
elseif string.match(ngx.var.uri, "functionWithEmptyArray") then
|
|
ngx.header["Content-Type"] = "application/json"
|
|
local str = "{\"statusCode\": 200, \"testbody\": [], \"isBase64Encoded\": false}"
|
|
ngx.say(str)
|
|
|
|
elseif string.match(ngx.var.uri, "functionWithArrayCTypeInMVHAndEmptyArray") then
|
|
ngx.header["Content-Type"] = "application/json"
|
|
ngx.say("{\"statusCode\": 200, \"isBase64Encoded\": true, \"body\": \"eyJrZXkiOiAidmFsdWUiLCAia2V5MiI6IFtdfQ==\", \"headers\": {}, \"multiValueHeaders\": {\"Content-Type\": [\"application/json+test\"]}}")
|
|
|
|
elseif type(res) == 'string' then
|
|
ngx.header["Content-Length"] = #res + 1
|
|
ngx.say(res)
|
|
|
|
else
|
|
ngx.req.discard_body()
|
|
ngx.header['Content-Length'] = 0
|
|
end
|
|
|
|
ngx.exit(0)
|
|
end
|
|
|
|
ngx.sleep(.2) -- mock some network latency
|
|
|
|
local invocation_type = ngx.var.http_x_amz_invocation_type
|
|
if invocation_type == 'Event' then
|
|
say(nil, 202)
|
|
|
|
elseif invocation_type == 'DryRun' then
|
|
say(nil, 204)
|
|
end
|
|
|
|
local qargs = ngx.req.get_uri_args()
|
|
ngx.req.read_body()
|
|
local request_body = ngx.req.get_body_data()
|
|
if request_body == nil then
|
|
local body_file = ngx.req.get_body_file()
|
|
if body_file then
|
|
ngx.log(ngx.DEBUG, "reading file cached to disk: ",body_file)
|
|
local file = io.open(body_file, "rb")
|
|
request_body = file:read("*all")
|
|
file:close()
|
|
end
|
|
end
|
|
print(request_body)
|
|
local args = require("cjson").decode(request_body)
|
|
|
|
say(request_body, 200)
|
|
end
|
|
local ok, err = pcall(x)
|
|
if not ok then
|
|
ngx.log(ngx.ERR, "Mock error: ", err)
|
|
end
|
|
}
|
|
}
|
|
}
|
|
|
|
]]
|
|
},
|
|
}
|
|
|
|
fixtures.stream_mock = {
|
|
lambda_proxy = [[
|
|
server {
|
|
listen 13128;
|
|
|
|
content_by_lua_block {
|
|
require("spec.fixtures.forward-proxy-server").connect()
|
|
}
|
|
}
|
|
]],
|
|
}
|
|
|
|
fixtures.dns_mock:A {
|
|
name = "lambda.us-east-1.amazonaws.com",
|
|
address = "127.0.0.1",
|
|
}
|
|
|
|
return fixtures
|