Skip to content

Commit 2e94f8b

Browse files
committed
Use extension method
1 parent 57bfdc2 commit 2e94f8b

14 files changed

+387
-577
lines changed

Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/ApiGatewayHttpApiV2ProxyRequestTranslator.cs

Lines changed: 0 additions & 71 deletions
This file was deleted.

Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/ApiGatewayMode.cs

Lines changed: 0 additions & 23 deletions
This file was deleted.

Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/ApiGatewayProxyRequestTranslator.cs

Lines changed: 0 additions & 61 deletions
This file was deleted.

Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/ApiGatewayRequestTranslatorFactory.cs

Lines changed: 0 additions & 36 deletions
This file was deleted.
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
namespace Amazon.Lambda.TestTool
2+
{
3+
public class ApiGatewayRouteConfig
4+
{
5+
public string LambdaResourceName { get; set; }
6+
public string Endpoint { get; set; }
7+
public string HttpMethod { get; set; }
8+
public string Path { get; set; }
9+
}
10+
}
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
using Amazon.Lambda.APIGatewayEvents;
2+
using System.Text;
3+
using System.Web;
4+
using static Amazon.Lambda.APIGatewayEvents.APIGatewayHttpApiV2ProxyRequest;
5+
6+
namespace Amazon.Lambda.TestTool
7+
{
8+
/// <summary>
9+
/// Provides extension methods to translate an <see cref="HttpContext"/> to different types of API Gateway requests.
10+
/// </summary>
11+
public static class HttpContextExtensions
12+
{
13+
private static IHttpRequestUtility _httpRequestUtility = new HttpRequestUtility();
14+
private static IRouteConfigurationParser _routeConfigurationParser;
15+
16+
public static void SetHttpRequestUtility(IHttpRequestUtility httpRequestUtility)
17+
{
18+
_httpRequestUtility = httpRequestUtility ?? throw new ArgumentNullException(nameof(httpRequestUtility));
19+
}
20+
21+
public static void SetRouteConfigurationParser(IRouteConfigurationParser routeConfigurationParser)
22+
{
23+
_routeConfigurationParser = routeConfigurationParser ?? throw new ArgumentNullException(nameof(routeConfigurationParser));
24+
}
25+
26+
/// <summary>
27+
/// Translates an <see cref="HttpContext"/> to an <see cref="APIGatewayHttpApiV2ProxyRequest"/>.
28+
/// </summary>
29+
/// <param name="context">The <see cref="HttpContext"/> to be translated.</param>
30+
/// <returns>An <see cref="APIGatewayHttpApiV2ProxyRequest"/> object representing the translated request.</returns>
31+
public static APIGatewayHttpApiV2ProxyRequest ToApiGatewayHttpV2Request(
32+
this HttpContext context)
33+
{
34+
var request = context.Request;
35+
36+
var matchedConfig = _routeConfigurationParser.GetRouteConfig(request.Method, request.Path);
37+
var pathParameters = _routeConfigurationParser.ExtractPathParameters(matchedConfig, request.Path);
38+
39+
var (headers, _) = _httpRequestUtility.ExtractHeaders(request.Headers);
40+
var (queryStringParameters, _) = _httpRequestUtility.ExtractQueryStringParameters(request.Query);
41+
42+
var httpApiV2ProxyRequest = new APIGatewayHttpApiV2ProxyRequest
43+
{
44+
RouteKey = $"{request.Method} {matchedConfig.Path}",
45+
RawPath = request.Path,
46+
RawQueryString = request.QueryString.Value,
47+
Cookies = request.Cookies.Select(c => $"{c.Key}={c.Value}").ToArray(),
48+
Headers = headers,
49+
QueryStringParameters = queryStringParameters,
50+
PathParameters = pathParameters ?? new Dictionary<string, string>(),
51+
Body = _httpRequestUtility.ReadRequestBody(request),
52+
IsBase64Encoded = false,
53+
RequestContext = new ProxyRequestContext
54+
{
55+
Http = new HttpDescription
56+
{
57+
Method = request.Method,
58+
Path = request.Path,
59+
Protocol = request.Protocol
60+
},
61+
RouteKey = $"{request.Method} {matchedConfig.Path}"
62+
},
63+
Version = "2.0"
64+
};
65+
66+
if (_httpRequestUtility.IsBinaryContent(request.ContentType))
67+
{
68+
httpApiV2ProxyRequest.Body = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(httpApiV2ProxyRequest.Body));
69+
httpApiV2ProxyRequest.IsBase64Encoded = true;
70+
}
71+
72+
return httpApiV2ProxyRequest;
73+
}
74+
75+
/// <summary>
76+
/// Translates an <see cref="HttpContext"/> to an <see cref="APIGatewayProxyRequest"/>.
77+
/// </summary>
78+
/// <param name="context">The <see cref="HttpContext"/> to be translated.</param>
79+
/// <returns>An <see cref="APIGatewayProxyRequest"/> object representing the translated request.</returns>
80+
public static APIGatewayProxyRequest ToApiGatewayRequest(
81+
this HttpContext context)
82+
{
83+
var request = context.Request;
84+
85+
var matchedConfig = _routeConfigurationParser.GetRouteConfig(request.Method, request.Path);
86+
var pathParameters = _routeConfigurationParser.ExtractPathParameters(matchedConfig, request.Path);
87+
88+
var (headers, multiValueHeaders) = _httpRequestUtility.ExtractHeaders(request.Headers);
89+
var (queryStringParameters, multiValueQueryStringParameters) = _httpRequestUtility.ExtractQueryStringParameters(request.Query);
90+
91+
var proxyRequest = new APIGatewayProxyRequest
92+
{
93+
Resource = matchedConfig.Path,
94+
Path = HttpUtility.UrlEncode(request.Path),
95+
HttpMethod = request.Method,
96+
Headers = headers,
97+
MultiValueHeaders = multiValueHeaders,
98+
QueryStringParameters = queryStringParameters,
99+
MultiValueQueryStringParameters = multiValueQueryStringParameters,
100+
PathParameters = pathParameters ?? new Dictionary<string, string>(),
101+
Body = _httpRequestUtility.ReadRequestBody(request),
102+
IsBase64Encoded = false
103+
};
104+
105+
if (_httpRequestUtility.IsBinaryContent(request.ContentType))
106+
{
107+
proxyRequest.Body = Convert.ToBase64String(Encoding.UTF8.GetBytes(proxyRequest.Body));
108+
proxyRequest.IsBase64Encoded = true;
109+
}
110+
111+
return proxyRequest;
112+
}
113+
}
114+
}

Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/IApiGatewayRequestTranslator.cs

Lines changed: 0 additions & 23 deletions
This file was deleted.

Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/IApiGatewayRequestTranslatorFactory.cs

Lines changed: 0 additions & 15 deletions
This file was deleted.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace Amazon.Lambda.TestTool
2+
{
3+
public interface IRouteConfigurationParser
4+
{
5+
ApiGatewayRouteConfig GetRouteConfig(string httpMethod, string path);
6+
IDictionary<string, string> ExtractPathParameters(ApiGatewayRouteConfig routeConfig, string requestPath);
7+
}
8+
}

0 commit comments

Comments
 (0)