|
9 | 9 | using System.Threading.Tasks; |
10 | 10 | using Microsoft.AspNetCore.Http; |
11 | 11 | using Microsoft.AspNetCore.Http.Features; |
| 12 | +using Microsoft.AspNetCore.WebUtilities; |
12 | 13 | using Microsoft.Extensions.Logging; |
13 | 14 | using Microsoft.Extensions.Logging.Abstractions; |
14 | 15 | using Microsoft.Extensions.ObjectPool; |
@@ -399,6 +400,39 @@ public async Task ReadAsync_DoesNotRethrowOverflowExceptions() |
399 | 400 | Assert.Equal("The supplied value is invalid.", modelError.ErrorMessage); |
400 | 401 | } |
401 | 402 |
|
| 403 | + [Fact] |
| 404 | + public async Task ReadAsync_RegistersFileStreamForDisposal() |
| 405 | + { |
| 406 | + // Arrange |
| 407 | + var formatter = new NewtonsoftJsonInputFormatter( |
| 408 | + GetLogger(), |
| 409 | + _serializerSettings, |
| 410 | + ArrayPool<char>.Shared, |
| 411 | + _objectPoolProvider, |
| 412 | + new MvcOptions(), |
| 413 | + new MvcNewtonsoftJsonOptions()); |
| 414 | + var httpContext = new Mock<HttpContext>(); |
| 415 | + IDisposable registerForDispose = null; |
| 416 | + |
| 417 | + var content = Encoding.UTF8.GetBytes("\"Hello world\""); |
| 418 | + httpContext.Setup(h => h.Request.Body).Returns(new NonSeekableReadStream(content, allowSyncReads: false)); |
| 419 | + httpContext.Setup(h => h.Request.ContentType).Returns("application/json"); |
| 420 | + httpContext.Setup(h => h.Response.RegisterForDispose(It.IsAny<IDisposable>())) |
| 421 | + .Callback((IDisposable disposable) => registerForDispose = disposable) |
| 422 | + .Verifiable(); |
| 423 | + |
| 424 | + var formatterContext = CreateInputFormatterContext(typeof(string), httpContext.Object); |
| 425 | + |
| 426 | + // Act |
| 427 | + var result = await formatter.ReadAsync(formatterContext); |
| 428 | + |
| 429 | + // Assert |
| 430 | + Assert.Equal("Hello world", result.Model); |
| 431 | + Assert.NotNull(registerForDispose); |
| 432 | + Assert.IsType<FileBufferingReadStream>(registerForDispose); |
| 433 | + httpContext.Verify(); |
| 434 | + } |
| 435 | + |
402 | 436 | private class TestableJsonInputFormatter : NewtonsoftJsonInputFormatter |
403 | 437 | { |
404 | 438 | public TestableJsonInputFormatter(JsonSerializerSettings settings, ObjectPoolProvider objectPoolProvider) |
|
0 commit comments