@@ -386,4 +386,117 @@ public void ToApiGatewayRequest_ShouldDecodePathWithUnicodeCharacters()
386
386
Assert . Equal ( "😊 Happy" , result . PathParameters [ "reviewTitle" ] ) ;
387
387
}
388
388
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
+
389
502
}
0 commit comments