Skip to content

Commit 1080c5c

Browse files
committed
add tests for headers special characters
1 parent dcacd0b commit 1080c5c

File tree

1 file changed

+113
-0
lines changed

1 file changed

+113
-0
lines changed

Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/Extensions/HttpContextExtensionsTests.cs

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,4 +386,117 @@ public void ToApiGatewayRequest_ShouldDecodePathWithUnicodeCharacters()
386386
Assert.Equal("😊 Happy", result.PathParameters["reviewTitle"]);
387387
}
388388

389+
[Fact]
390+
public void ToApiGatewayHttpV2Request_ShouldNotDecodeUrlEncodedAndUnicodeHeaderValues()
391+
{
392+
var context = new DefaultHttpContext();
393+
var request = context.Request;
394+
request.Method = "GET";
395+
request.Path = "/api/test";
396+
request.Headers["X-Encoded-Header"] = "value%20with%20spaces";
397+
request.Headers["X-Unicode-Header"] = "☕ Coffee";
398+
request.Headers["X-Mixed-Header"] = "Hello%2C%20World%21%20☕";
399+
request.Headers["X-Raw-Unicode"] = "\u2615 Coffee";
400+
401+
var apiGatewayRouteConfig = new ApiGatewayRouteConfig
402+
{
403+
LambdaResourceName = "TestFunction",
404+
Endpoint = "GET /api/test",
405+
HttpMethod = "GET",
406+
Path = "/api/test"
407+
};
408+
409+
var result = context.ToApiGatewayHttpV2Request(apiGatewayRouteConfig);
410+
411+
Assert.NotNull(result);
412+
Assert.Equal("value%20with%20spaces", result.Headers["X-Encoded-Header"]);
413+
Assert.Equal("☕ Coffee", result.Headers["X-Unicode-Header"]);
414+
Assert.Equal("Hello%2C%20World%21%20☕", result.Headers["X-Mixed-Header"]);
415+
Assert.Equal("\u2615 Coffee", result.Headers["X-Raw-Unicode"]);
416+
}
417+
418+
[Fact]
419+
public void ToApiGatewayRequest_ShouldNotDecodeUrlEncodedAndUnicodeHeaderValues()
420+
{
421+
var context = new DefaultHttpContext();
422+
var request = context.Request;
423+
request.Method = "GET";
424+
request.Path = "/api/test";
425+
request.Headers["X-Encoded-Header"] = "value%20with%20spaces";
426+
request.Headers["X-Unicode-Header"] = "☕ Coffee";
427+
request.Headers["X-Mixed-Header"] = "Hello%2C%20World%21%20☕";
428+
request.Headers["X-Raw-Unicode"] = "\u2615 Coffee";
429+
430+
var apiGatewayRouteConfig = new ApiGatewayRouteConfig
431+
{
432+
LambdaResourceName = "TestFunction",
433+
Endpoint = "GET /api/test",
434+
HttpMethod = "GET",
435+
Path = "/api/test"
436+
};
437+
438+
var result = context.ToApiGatewayRequest(apiGatewayRouteConfig);
439+
440+
Assert.NotNull(result);
441+
Assert.Equal("value%20with%20spaces", result.Headers["X-Encoded-Header"]);
442+
Assert.Equal("☕ Coffee", result.Headers["X-Unicode-Header"]);
443+
Assert.Equal("Hello%2C%20World%21%20☕", result.Headers["X-Mixed-Header"]);
444+
Assert.Equal("\u2615 Coffee", result.Headers["X-Raw-Unicode"]);
445+
446+
Assert.Equal(new List<string> { "value%20with%20spaces" }, result.MultiValueHeaders["X-Encoded-Header"]);
447+
Assert.Equal(new List<string> { "☕ Coffee" }, result.MultiValueHeaders["X-Unicode-Header"]);
448+
Assert.Equal(new List<string> { "Hello%2C%20World%21%20☕" }, result.MultiValueHeaders["X-Mixed-Header"]);
449+
Assert.Equal(new List<string> { "\u2615 Coffee" }, result.MultiValueHeaders["X-Raw-Unicode"]);
450+
}
451+
452+
[Fact]
453+
public void ToApiGatewayHttpV2Request_ShouldHandleMultipleHeaderValuesWithUnicode()
454+
{
455+
var context = new DefaultHttpContext();
456+
var request = context.Request;
457+
request.Method = "GET";
458+
request.Path = "/api/test";
459+
request.Headers["X-Multi-Value"] = new string[] { "value1", "value2%20with%20spaces", "☕ Coffee", "value4%20☕" };
460+
461+
var apiGatewayRouteConfig = new ApiGatewayRouteConfig
462+
{
463+
LambdaResourceName = "TestFunction",
464+
Endpoint = "GET /api/test",
465+
HttpMethod = "GET",
466+
Path = "/api/test"
467+
};
468+
469+
var result = context.ToApiGatewayHttpV2Request(apiGatewayRouteConfig);
470+
471+
Assert.NotNull(result);
472+
Assert.Equal("value1,value2%20with%20spaces,☕ Coffee,value4%20☕", result.Headers["X-Multi-Value"]);
473+
}
474+
475+
[Fact]
476+
public void ToApiGatewayRequest_ShouldHandleMultipleHeaderValuesWithUnicode()
477+
{
478+
var context = new DefaultHttpContext();
479+
var request = context.Request;
480+
request.Method = "GET";
481+
request.Path = "/api/test";
482+
request.Headers["X-Multi-Value"] = new string[] { "value1", "value2%20with%20spaces", "☕ Coffee", "value4%20☕" };
483+
484+
var apiGatewayRouteConfig = new ApiGatewayRouteConfig
485+
{
486+
LambdaResourceName = "TestFunction",
487+
Endpoint = "GET /api/test",
488+
HttpMethod = "GET",
489+
Path = "/api/test"
490+
};
491+
492+
var result = context.ToApiGatewayRequest(apiGatewayRouteConfig);
493+
494+
Assert.NotNull(result);
495+
Assert.Equal("value4%20☕", result.Headers["X-Multi-Value"]); // v1 API uses the last value for single-value headers
496+
Assert.Equal(
497+
new List<string> { "value1", "value2%20with%20spaces", "☕ Coffee", "value4%20☕" },
498+
result.MultiValueHeaders["X-Multi-Value"]
499+
);
500+
}
501+
389502
}

0 commit comments

Comments
 (0)