in Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Extensions/HttpContextExtensions.cs [128:221]
public static async Task<APIGatewayProxyRequest> ToApiGatewayRequest(
this HttpContext context,
ApiGatewayRouteConfig apiGatewayRouteConfig,
ApiGatewayEmulatorMode emulatorMode)
{
var request = context.Request;
var body = await HttpRequestUtility.ReadRequestBody(request);
var contentLength = HttpRequestUtility.CalculateContentLength(request, body);
var pathParameters = RouteTemplateUtility.ExtractPathParameters(apiGatewayRouteConfig.Path, request.Path);
var (headers, multiValueHeaders) = HttpRequestUtility.ExtractHeaders(request.Headers);
var (queryStringParameters, multiValueQueryStringParameters) = HttpRequestUtility.ExtractQueryStringParameters(request.Query);
if (!headers.ContainsKey("content-length") && emulatorMode != ApiGatewayEmulatorMode.Rest) // rest doesnt set content-length by default
{
headers["content-length"] = contentLength.ToString();
multiValueHeaders["content-length"] = [contentLength.ToString()];
}
if (!headers.ContainsKey("content-type"))
{
headers["content-type"] = "text/plain; charset=utf-8";
multiValueHeaders["content-type"] = ["text/plain; charset=utf-8"];
}
if (HttpRequestUtility.IsBinaryContent(request.ContentType) && emulatorMode == ApiGatewayEmulatorMode.Rest) // Rest mode with binary content never sends content length
{
headers.Remove("content-length");
multiValueHeaders.Remove("content-length");
}
// This is the decoded value
var path = request.Path.Value;
if (emulatorMode == ApiGatewayEmulatorMode.HttpV1 || emulatorMode == ApiGatewayEmulatorMode.Rest) // rest and httpv1 uses the encoded value for path an
{
path = request.Path.ToUriComponent();
}
if (emulatorMode == ApiGatewayEmulatorMode.Rest) // rest uses encoded value for the path params
{
#pragma warning disable SYSLIB0013 // Type or member is obsolete
var encodedPathParameters = pathParameters.ToDictionary(
kvp => kvp.Key,
kvp => Uri.EscapeUriString(kvp.Value)); // intentionally using EscapeUriString over EscapeDataString since EscapeUriString correctly handles reserved characters :/?#[]@!$&'()*+,;= in this case
#pragma warning restore SYSLIB0013 // Type or member is obsolete
pathParameters = encodedPathParameters;
}
var proxyRequest = new APIGatewayProxyRequest
{
Resource = apiGatewayRouteConfig.Path,
Path = path,
HttpMethod = request.Method,
Body = body,
IsBase64Encoded = false
};
if (headers.Any())
{
proxyRequest.Headers = headers;
}
if (multiValueHeaders.Any())
{
proxyRequest.MultiValueHeaders = multiValueHeaders;
}
if (queryStringParameters.Any())
{
// this should be decoded value
proxyRequest.QueryStringParameters = queryStringParameters;
}
if (multiValueQueryStringParameters.Any())
{
// this should be decoded value
proxyRequest.MultiValueQueryStringParameters = multiValueQueryStringParameters;
}
if (pathParameters.Any())
{
proxyRequest.PathParameters = pathParameters;
}
if (HttpRequestUtility.IsBinaryContent(request.ContentType))
{
proxyRequest.IsBase64Encoded = true;
}
return proxyRequest;
}