159 lines
6.7 KiB
C#
159 lines
6.7 KiB
C#
// Copyright (c) .NET Foundation. All rights reserved.
|
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
|
|
|
using System;
|
|
using System.IO;
|
|
using System.Net.Http;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using Microsoft.AspNetCore.Http;
|
|
using Microsoft.AspNetCore.Mvc.Formatters;
|
|
using Microsoft.AspNetCore.Mvc.WebApiCompatShim;
|
|
using Microsoft.AspNetCore.Testing.xunit;
|
|
using Moq;
|
|
using Moq.Protected;
|
|
using Xunit;
|
|
|
|
namespace Microsoft.AspNetCore.Mvc.WebApiCompatShimTest
|
|
{
|
|
public class HttpResponseMessageOutputFormatterTests
|
|
{
|
|
[Fact]
|
|
public async Task Disposed_CalledOn_HttpResponseMessage()
|
|
{
|
|
// Arrange
|
|
var formatter = new HttpResponseMessageOutputFormatter();
|
|
var streamContent = new Mock<StreamContent>(new MemoryStream());
|
|
streamContent.Protected().Setup("Dispose", true).Verifiable();
|
|
var httpResponseMessage = new HttpResponseMessage();
|
|
httpResponseMessage.Content = streamContent.Object;
|
|
var outputFormatterContext = GetOutputFormatterContext(
|
|
httpResponseMessage,
|
|
typeof(HttpResponseMessage),
|
|
new DefaultHttpContext());
|
|
|
|
// Act
|
|
await formatter.WriteAsync(outputFormatterContext);
|
|
|
|
// Assert
|
|
streamContent.Protected().Verify("Dispose", Times.Once(), true);
|
|
}
|
|
|
|
[ConditionalFact]
|
|
// Issue - https://github.com/aspnet/External/issues/20
|
|
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
|
|
public async Task ExplicitlySet_ChunkedEncodingFlag_IsIgnored()
|
|
{
|
|
// Arrange
|
|
var httpResponseMessage = new HttpResponseMessage();
|
|
httpResponseMessage.Content = new StreamContent(new MemoryStream(Encoding.UTF8.GetBytes("Hello, World")));
|
|
httpResponseMessage.Headers.TransferEncodingChunked = true;
|
|
|
|
var httpContext = new DefaultHttpContext();
|
|
var formatter = new HttpResponseMessageOutputFormatter();
|
|
var outputFormatterContext = GetOutputFormatterContext(
|
|
httpResponseMessage,
|
|
typeof(HttpResponseMessage),
|
|
httpContext);
|
|
// Act
|
|
await formatter.WriteAsync(outputFormatterContext);
|
|
|
|
// Assert
|
|
Assert.False(httpContext.Response.Headers.ContainsKey("Transfer-Encoding"));
|
|
Assert.NotNull(httpContext.Response.ContentLength);
|
|
}
|
|
|
|
[ConditionalFact]
|
|
// Issue - https://github.com/aspnet/External/issues/20
|
|
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
|
|
public async Task ExplicitlySet_ChunkedEncodingHeader_IsIgnored()
|
|
{
|
|
// Arrange
|
|
var transferEncodingHeaderKey = "Transfer-Encoding";
|
|
var httpResponseMessage = new HttpResponseMessage();
|
|
httpResponseMessage.Content = new StreamContent(new MemoryStream(Encoding.UTF8.GetBytes("Hello, World")));
|
|
httpResponseMessage.Headers.Add(transferEncodingHeaderKey, "chunked");
|
|
|
|
var httpContext = new DefaultHttpContext();
|
|
var formatter = new HttpResponseMessageOutputFormatter();
|
|
var outputFormatterContext = GetOutputFormatterContext(
|
|
httpResponseMessage,
|
|
typeof(HttpResponseMessage),
|
|
httpContext);
|
|
// Act
|
|
await formatter.WriteAsync(outputFormatterContext);
|
|
|
|
// Assert
|
|
Assert.False(httpContext.Response.Headers.ContainsKey(transferEncodingHeaderKey));
|
|
Assert.NotNull(httpContext.Response.ContentLength);
|
|
}
|
|
|
|
[ConditionalFact]
|
|
// Issue - https://github.com/aspnet/External/issues/20
|
|
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
|
|
public async Task ExplicitlySet_MultipleEncodings_ChunkedNotIgnored()
|
|
{
|
|
// Arrange
|
|
var transferEncodingHeaderKey = "Transfer-Encoding";
|
|
var httpResponseMessage = new HttpResponseMessage();
|
|
httpResponseMessage.Content = new StreamContent(new MemoryStream(Encoding.UTF8.GetBytes("Hello, World")));
|
|
httpResponseMessage.Headers.Add(transferEncodingHeaderKey, new[] { "identity", "chunked" });
|
|
|
|
var httpContext = new DefaultHttpContext();
|
|
var formatter = new HttpResponseMessageOutputFormatter();
|
|
var outputFormatterContext = GetOutputFormatterContext(
|
|
httpResponseMessage,
|
|
typeof(HttpResponseMessage),
|
|
httpContext);
|
|
// Act
|
|
await formatter.WriteAsync(outputFormatterContext);
|
|
|
|
// Assert
|
|
Assert.True(httpContext.Response.Headers.ContainsKey(transferEncodingHeaderKey));
|
|
Assert.Equal(new string[] { "identity", "chunked" },
|
|
httpContext.Response.Headers[transferEncodingHeaderKey]);
|
|
Assert.NotNull(httpContext.Response.ContentLength);
|
|
}
|
|
|
|
[ConditionalFact]
|
|
// Issue - https://github.com/aspnet/External/issues/20
|
|
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
|
|
public async Task ExplicitlySet_MultipleEncodingsUsingChunkedFlag_ChunkedNotIgnored()
|
|
{
|
|
// Arrange
|
|
var transferEncodingHeaderKey = "Transfer-Encoding";
|
|
var httpResponseMessage = new HttpResponseMessage();
|
|
httpResponseMessage.Content = new StreamContent(new MemoryStream(Encoding.UTF8.GetBytes("Hello, World")));
|
|
httpResponseMessage.Headers.Add(transferEncodingHeaderKey, new[] { "identity" });
|
|
httpResponseMessage.Headers.TransferEncodingChunked = true;
|
|
|
|
var httpContext = new DefaultHttpContext();
|
|
var formatter = new HttpResponseMessageOutputFormatter();
|
|
var outputFormatterContext = GetOutputFormatterContext(
|
|
httpResponseMessage,
|
|
typeof(HttpResponseMessage),
|
|
httpContext);
|
|
// Act
|
|
await formatter.WriteAsync(outputFormatterContext);
|
|
|
|
// Assert
|
|
Assert.True(httpContext.Response.Headers.ContainsKey(transferEncodingHeaderKey));
|
|
Assert.Equal(new string[] { "identity", "chunked" },
|
|
httpContext.Response.Headers[transferEncodingHeaderKey]);
|
|
Assert.NotNull(httpContext.Response.ContentLength);
|
|
}
|
|
|
|
private OutputFormatterWriteContext GetOutputFormatterContext(
|
|
object outputValue,
|
|
Type outputType,
|
|
HttpContext httpContext)
|
|
{
|
|
return new OutputFormatterWriteContext(
|
|
httpContext,
|
|
new TestHttpResponseStreamWriterFactory().CreateWriter,
|
|
outputType,
|
|
outputValue);
|
|
}
|
|
}
|
|
}
|