diff --git a/src/Microsoft.AspNetCore.Http/Features/FormFeature.cs b/src/Microsoft.AspNetCore.Http/Features/FormFeature.cs index 02c1bd7a8b..865e183f76 100644 --- a/src/Microsoft.AspNetCore.Http/Features/FormFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/FormFeature.cs @@ -131,6 +131,11 @@ namespace Microsoft.AspNetCore.Http.Features cancellationToken.ThrowIfCancellationRequested(); + if (_request.ContentLength == 0) + { + return FormCollection.Empty; + } + if (_options.BufferBody) { _request.EnableRewind(_options.MemoryBufferThreshold, _options.BufferBodyLengthLimit); diff --git a/test/Microsoft.AspNetCore.Http.Tests/Features/FormFeatureTests.cs b/test/Microsoft.AspNetCore.Http.Tests/Features/FormFeatureTests.cs index 591f46a43e..cfa8b0215b 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/Features/FormFeatureTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/Features/FormFeatureTests.cs @@ -12,6 +12,23 @@ namespace Microsoft.AspNetCore.Http.Features { public class FormFeatureTests { + [Fact] + public async Task ReadFormAsync_0ContentLength_ReturnsEmptyForm() + { + var context = new DefaultHttpContext(); + var responseFeature = new FakeResponseFeature(); + context.Features.Set(responseFeature); + context.Request.ContentType = MultipartContentType; + context.Request.ContentLength = 0; + + var formFeature = new FormFeature(context.Request, new FormOptions()); + context.Features.Set(formFeature); + + var formCollection = await context.Request.ReadFormAsync(); + + Assert.Same(FormCollection.Empty, formCollection); + } + [Theory] [InlineData(true)] [InlineData(false)]