Files
2026-07-13 12:32:21 +08:00

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