#490 use byte content not stream (#498)

This commit is contained in:
Tom Pallister 2018-07-25 08:34:58 +01:00 committed by GitHub
parent 69ca874239
commit d186f0e1b6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 24 additions and 10 deletions

View File

@ -7,6 +7,6 @@
public interface IRequestMapper public interface IRequestMapper
{ {
Response<HttpRequestMessage> Map(HttpRequest request); Task<Response<HttpRequestMessage>> Map(HttpRequest request);
} }
} }

View File

@ -15,13 +15,13 @@
{ {
private readonly string[] _unsupportedHeaders = { "host" }; private readonly string[] _unsupportedHeaders = { "host" };
public Response<HttpRequestMessage> Map(HttpRequest request) public async Task<Response<HttpRequestMessage>> Map(HttpRequest request)
{ {
try try
{ {
var requestMessage = new HttpRequestMessage() var requestMessage = new HttpRequestMessage()
{ {
Content = MapContent(request), Content = await MapContent(request),
Method = MapMethod(request), Method = MapMethod(request),
RequestUri = MapUri(request) RequestUri = MapUri(request)
}; };
@ -36,14 +36,15 @@
} }
} }
private HttpContent MapContent(HttpRequest request) private async Task<HttpContent> MapContent(HttpRequest request)
{ {
if (request.Body == null || (request.Body.CanSeek && request.Body.Length <= 0)) if (request.Body == null || (request.Body.CanSeek && request.Body.Length <= 0))
{ {
return null; return null;
} }
var content = new StreamContent(request.Body); // Never change this to StreamContent again, I forgot it doesnt work in #464.
var content = new ByteArrayContent(await ToByteArray(request.Body));
if(!string.IsNullOrEmpty(request.ContentType)) if(!string.IsNullOrEmpty(request.ContentType))
{ {
@ -95,5 +96,17 @@
{ {
return !_unsupportedHeaders.Contains(header.Key.ToLower()); return !_unsupportedHeaders.Contains(header.Key.ToLower());
} }
private async Task<byte[]> ToByteArray(Stream stream)
{
using(stream)
{
using (var memStream = new MemoryStream())
{
await stream.CopyToAsync(memStream);
return memStream.ToArray();
}
}
}
} }
} }

View File

@ -27,7 +27,7 @@ namespace Ocelot.Request.Middleware
public async Task Invoke(DownstreamContext context) public async Task Invoke(DownstreamContext context)
{ {
var downstreamRequest = _requestMapper.Map(context.HttpContext.Request); var downstreamRequest = await _requestMapper.Map(context.HttpContext.Request);
if (downstreamRequest.IsError) if (downstreamRequest.IsError)
{ {

View File

@ -95,7 +95,7 @@ namespace Ocelot.UnitTests.Request
_requestMapper _requestMapper
.Setup(rm => rm.Map(It.IsAny<HttpRequest>())) .Setup(rm => rm.Map(It.IsAny<HttpRequest>()))
.Returns(_mappedRequest); .ReturnsAsync(_mappedRequest);
} }
private void GivenTheMapperWillReturnAnError() private void GivenTheMapperWillReturnAnError()
@ -104,7 +104,7 @@ namespace Ocelot.UnitTests.Request
_requestMapper _requestMapper
.Setup(rm => rm.Map(It.IsAny<HttpRequest>())) .Setup(rm => rm.Map(It.IsAny<HttpRequest>()))
.Returns(_mappedRequest); .ReturnsAsync(_mappedRequest);
} }
private void WhenTheMiddlewareIsInvoked() private void WhenTheMiddlewareIsInvoked()

View File

@ -16,6 +16,7 @@
using System.IO; using System.IO;
using System.Text; using System.Text;
using System.Security.Cryptography; using System.Security.Cryptography;
using System.Threading.Tasks;
public class RequestMapperTests public class RequestMapperTests
{ {
@ -378,9 +379,9 @@
_inputRequest.Body = null; _inputRequest.Body = null;
} }
private void WhenMapped() private async Task WhenMapped()
{ {
_mappedRequest = _requestMapper.Map(_inputRequest); _mappedRequest = await _requestMapper.Map(_inputRequest);
} }
private void ThenNoErrorIsReturned() private void ThenNoErrorIsReturned()