#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
5 changed files with 24 additions and 10 deletions

View File

@ -7,6 +7,6 @@
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" };
public Response<HttpRequestMessage> Map(HttpRequest request)
public async Task<Response<HttpRequestMessage>> Map(HttpRequest request)
{
try
{
var requestMessage = new HttpRequestMessage()
{
Content = MapContent(request),
Content = await MapContent(request),
Method = MapMethod(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))
{
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))
{
@ -95,5 +96,17 @@
{
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)
{
var downstreamRequest = _requestMapper.Map(context.HttpContext.Request);
var downstreamRequest = await _requestMapper.Map(context.HttpContext.Request);
if (downstreamRequest.IsError)
{