Skip to content

Commit c962827

Browse files
authored
return value for single HttpContext parameter (#40235)
1 parent fb3d4f9 commit c962827

File tree

2 files changed

+34
-0
lines changed

2 files changed

+34
-0
lines changed

src/Http/Routing/src/Builder/EndpointRouteBuilderExtensions.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ public static IEndpointConventionBuilder MapGet(
3838
string pattern,
3939
RequestDelegate requestDelegate)
4040
{
41+
var returnType = requestDelegate.Method.ReturnType;
42+
if (returnType is { IsGenericType: true } && returnType.GetGenericTypeDefinition() == typeof(Task<>))
43+
{
44+
return MapMethods(endpoints, pattern, GetVerb, requestDelegate as Delegate);
45+
}
4146
return MapMethods(endpoints, pattern, GetVerb, requestDelegate);
4247
}
4348

src/Http/Routing/test/UnitTests/Builder/RequestDelegateEndpointRouteBuilderExtensionsTest.cs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
// Licensed to the .NET Foundation under one or more agreements.
22
// The .NET Foundation licenses this file to you under the MIT license.
33

4+
using System.IO.Pipelines;
45
using System.Linq.Expressions;
6+
using System.Text;
57
using Microsoft.AspNetCore.Http;
8+
using Microsoft.AspNetCore.Http.Features;
69
using Microsoft.AspNetCore.Routing;
710
using Microsoft.AspNetCore.Routing.Patterns;
11+
using Microsoft.Extensions.DependencyInjection;
12+
using Microsoft.Extensions.Logging;
813
using Moq;
914

1015
namespace Microsoft.AspNetCore.Builder;
@@ -69,6 +74,30 @@ public void MapEndpoint_StringPattern_BuildsEndpoint()
6974
Assert.Equal("/", endpointBuilder1.RoutePattern.RawText);
7075
}
7176

77+
[Fact]
78+
public async Task MapEndpoint_ReturnGenericTypeTask_GeneratedDelegate()
79+
{
80+
var httpContext = new DefaultHttpContext();
81+
var responseBodyStream = new MemoryStream();
82+
httpContext.Response.Body = responseBodyStream;
83+
84+
// Arrange
85+
var builder = new DefaultEndpointRouteBuilder(Mock.Of<IApplicationBuilder>());
86+
static async Task<string> GenericTypeTaskDelegate(HttpContext context) => await Task.FromResult("String Test");
87+
88+
// Act
89+
var endpointBuilder = builder.MapGet("/", GenericTypeTaskDelegate);
90+
91+
// Assert
92+
var endpointBuilder1 = GetRouteEndpointBuilder(builder);
93+
var requestDelegate = endpointBuilder1.RequestDelegate;
94+
await requestDelegate(httpContext);
95+
96+
var responseBody = Encoding.UTF8.GetString(responseBodyStream.ToArray());
97+
98+
Assert.Equal("String Test", responseBody);
99+
}
100+
72101
[Fact]
73102
public void MapEndpoint_TypedPattern_BuildsEndpoint()
74103
{

0 commit comments

Comments
 (0)