public static async Task ToApiGatewayRequest()

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;
    }