Skip to content

Commit 39b0556

Browse files
committed
update EndpointParameterEmitter
1 parent 3a44f58 commit 39b0556

File tree

2 files changed

+25
-3
lines changed

2 files changed

+25
-3
lines changed

src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Emitters/EndpointParameterEmitter.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,12 @@ internal static void EmitQueryOrHeaderParameterPreparation(this EndpointParamete
1818
{
1919
codeWriter.WriteLine(endpointParameter.EmitParameterDiagnosticComment());
2020

21-
var assigningCode = endpointParameter.Source is EndpointParameterSource.Header
22-
? $"httpContext.Request.Headers[\"{endpointParameter.LookupName}\"]"
23-
: $"httpContext.Request.Query[\"{endpointParameter.LookupName}\"]";
21+
var assigningCode = (endpointParameter.Source, endpointParameter.IsArray) switch
22+
{
23+
(EndpointParameterSource.Header, true) => $"httpContext.Request.Headers.GetCommaSeparatedValues(\"{endpointParameter.LookupName}\")",
24+
(EndpointParameterSource.Header, false) => $"httpContext.Request.Headers[\"{endpointParameter.LookupName}\"]",
25+
_ => $"httpContext.Request.Query[\"{endpointParameter.LookupName}\"]"
26+
};
2427
codeWriter.WriteLine($"var {endpointParameter.EmitAssigningCodeResult()} = {assigningCode};");
2528

2629
// If we are not optional, then at this point we can just assign the string value to the handler argument,

src/Http/Http.Extensions/test/RequestDelegateGenerator/CompileTimeCreationTests.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -788,4 +788,23 @@ public async Task RequestDelegatePopulatesFromOptionalFormParameterStringArray()
788788

789789
Assert.Equal<string[]>(["hello", "bye"], (string[])httpContext.Items["message"]);
790790
}
791+
792+
[Theory]
793+
[InlineData("""app.MapGet("/", ([FromHeader(Name = "q")] string[]? arr) => arr);""", "", "[]")]
794+
[InlineData("""app.MapGet("/", ([FromHeader(Name = "q")] string[]? arr) => arr);""", "a,b,c", "[\"a\",\"b\",\"c\"]")]
795+
[InlineData("""app.MapGet("/", ([FromHeader(Name = "q")] int[]? arr) => arr);""", "1,2,3", "[1,2,3]")]
796+
public async Task RequestDelegateGenerator_FromHeader_CommaSeparatedValues(string source, string headerContent, string expectedBody)
797+
{
798+
var (_, compilation) = await RunGeneratorAsync(source);
799+
var endpoints = GetEndpointsFromCompilation(compilation);
800+
801+
foreach (var endpoint in endpoints)
802+
{
803+
var httpContext = CreateHttpContext();
804+
httpContext.Request.Headers["q"] = headerContent;
805+
await endpoint.RequestDelegate(httpContext);
806+
807+
await VerifyResponseBodyAsync(httpContext, expectedBody);
808+
}
809+
}
791810
}

0 commit comments

Comments
 (0)