From c0e2100cd29f458b22883153d48ec84b31f40c8f Mon Sep 17 00:00:00 2001 From: Oleh Puzakov Date: Tue, 22 Jul 2025 16:00:50 +0200 Subject: [PATCH] Fix RequestDelegateFactory to handle nullable types correctly in empty request body scenarios --- .../src/RequestDelegateFactory.cs | 4 +++- .../test/RequestDelegateFactoryTests.cs | 21 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/Http/Http.Extensions/src/RequestDelegateFactory.cs b/src/Http/Http.Extensions/src/RequestDelegateFactory.cs index 19965ef1fc31..70f9b4b08f7a 100644 --- a/src/Http/Http.Extensions/src/RequestDelegateFactory.cs +++ b/src/Http/Http.Extensions/src/RequestDelegateFactory.cs @@ -1375,7 +1375,9 @@ private static Expression AddResponseWritingToMethodCall(Expression methodCall, { object? defaultBodyValue = null; - if (allowEmptyRequestBody && bodyType.IsValueType) + var isNullableType = bodyType.IsGenericType && bodyType.GetGenericTypeDefinition() == typeof(Nullable<>); + + if (allowEmptyRequestBody && bodyType.IsValueType && !isNullableType) // Nullable types should be left null { defaultBodyValue = CreateValueType(bodyType); } diff --git a/src/Http/Http.Extensions/test/RequestDelegateFactoryTests.cs b/src/Http/Http.Extensions/test/RequestDelegateFactoryTests.cs index 083da9bd7aed..35fb8c9ddd47 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateFactoryTests.cs +++ b/src/Http/Http.Extensions/test/RequestDelegateFactoryTests.cs @@ -896,6 +896,27 @@ public async Task RequestDelegateRejectsEmptyBodyGivenExplicitFromBodyParameter( Assert.Equal(400, httpContext.Response.StatusCode); } + [Fact] + public async Task RequestDelegatePopulatesNullFromBodyNullableParameterWithEmptyBody() + { + var httpContext = CreateHttpContext(); + httpContext.Request.Headers["Content-Type"] = "application/json"; + httpContext.Request.Headers["Content-Length"] = "0"; + httpContext.Features.Set(new RequestBodyDetectionFeature(false)); + + var factoryResult = RequestDelegateFactory.Create( + ([FromBody] int? body) => + { + httpContext.Items["body"] = body; + } + ); + + var requestDelegate = factoryResult.RequestDelegate; + await requestDelegate(httpContext); + + Assert.Null(httpContext.Items["body"]); + } + [Fact] public void RequestDelegateFactoryThrowsForByRefReturnTypes() {