mirror of
https://github.com/nsnail/Ocelot.git
synced 2025-06-19 14:58:16 +08:00
Feature/proxy reason phrase (#618)
* #599 started work to proxy reason phrase * #599 test for aggregator
This commit is contained in:
@ -1,30 +1,33 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Net;
|
||||
|
||||
namespace Ocelot.Cache
|
||||
{
|
||||
public class CachedResponse
|
||||
{
|
||||
public CachedResponse(
|
||||
HttpStatusCode statusCode,
|
||||
Dictionary<string, IEnumerable<string>> headers,
|
||||
string body,
|
||||
Dictionary<string, IEnumerable<string>> contentHeaders
|
||||
|
||||
)
|
||||
{
|
||||
StatusCode = statusCode;
|
||||
Headers = headers ?? new Dictionary<string, IEnumerable<string>>();
|
||||
ContentHeaders = contentHeaders ?? new Dictionary<string, IEnumerable<string>>();
|
||||
Body = body ?? "";
|
||||
}
|
||||
|
||||
public HttpStatusCode StatusCode { get; private set; }
|
||||
|
||||
public Dictionary<string, IEnumerable<string>> Headers { get; private set; }
|
||||
|
||||
public Dictionary<string, IEnumerable<string>> ContentHeaders { get; private set; }
|
||||
|
||||
public string Body { get; private set; }
|
||||
}
|
||||
}
|
||||
using System.Collections.Generic;
|
||||
using System.Net;
|
||||
|
||||
namespace Ocelot.Cache
|
||||
{
|
||||
public class CachedResponse
|
||||
{
|
||||
public CachedResponse(
|
||||
HttpStatusCode statusCode,
|
||||
Dictionary<string, IEnumerable<string>> headers,
|
||||
string body,
|
||||
Dictionary<string, IEnumerable<string>> contentHeaders,
|
||||
string reasonPhrase
|
||||
)
|
||||
{
|
||||
StatusCode = statusCode;
|
||||
Headers = headers ?? new Dictionary<string, IEnumerable<string>>();
|
||||
ContentHeaders = contentHeaders ?? new Dictionary<string, IEnumerable<string>>();
|
||||
Body = body ?? "";
|
||||
ReasonPhrase = reasonPhrase;
|
||||
}
|
||||
|
||||
public HttpStatusCode StatusCode { get; private set; }
|
||||
|
||||
public Dictionary<string, IEnumerable<string>> Headers { get; private set; }
|
||||
|
||||
public Dictionary<string, IEnumerable<string>> ContentHeaders { get; private set; }
|
||||
|
||||
public string Body { get; private set; }
|
||||
|
||||
public string ReasonPhrase { get; private set; }
|
||||
}
|
||||
}
|
||||
|
@ -87,7 +87,7 @@
|
||||
streamContent.Headers.TryAddWithoutValidation(header.Key, header.Value);
|
||||
}
|
||||
|
||||
return new DownstreamResponse(streamContent, cached.StatusCode, cached.Headers.ToList());
|
||||
return new DownstreamResponse(streamContent, cached.StatusCode, cached.Headers.ToList(), cached.ReasonPhrase);
|
||||
}
|
||||
|
||||
internal async Task<CachedResponse> CreateCachedResponse(DownstreamResponse response)
|
||||
@ -109,7 +109,7 @@
|
||||
|
||||
var contentHeaders = response?.Content?.Headers.ToDictionary(v => v.Key, v => v.Value);
|
||||
|
||||
var cached = new CachedResponse(statusCode, headers, body, contentHeaders);
|
||||
var cached = new CachedResponse(statusCode, headers, body, contentHeaders, response.ReasonPhrase);
|
||||
return cached;
|
||||
}
|
||||
}
|
||||
|
@ -7,25 +7,27 @@ namespace Ocelot.Middleware
|
||||
{
|
||||
public class DownstreamResponse
|
||||
{
|
||||
public DownstreamResponse(HttpContent content, HttpStatusCode statusCode, List<Header> headers)
|
||||
public DownstreamResponse(HttpContent content, HttpStatusCode statusCode, List<Header> headers, string reasonPhrase)
|
||||
{
|
||||
Content = content;
|
||||
StatusCode = statusCode;
|
||||
Headers = headers ?? new List<Header>();
|
||||
ReasonPhrase = reasonPhrase;
|
||||
}
|
||||
|
||||
public DownstreamResponse(HttpResponseMessage response)
|
||||
:this(response.Content, response.StatusCode, response.Headers.Select(x => new Header(x.Key, x.Value)).ToList())
|
||||
:this(response.Content, response.StatusCode, response.Headers.Select(x => new Header(x.Key, x.Value)).ToList(), response.ReasonPhrase)
|
||||
{
|
||||
}
|
||||
|
||||
public DownstreamResponse(HttpContent content, HttpStatusCode statusCode, IEnumerable<KeyValuePair<string, IEnumerable<string>>> headers)
|
||||
:this(content, statusCode, headers.Select(x => new Header(x.Key, x.Value)).ToList())
|
||||
public DownstreamResponse(HttpContent content, HttpStatusCode statusCode, IEnumerable<KeyValuePair<string, IEnumerable<string>>> headers, string reasonPhrase)
|
||||
:this(content, statusCode, headers.Select(x => new Header(x.Key, x.Value)).ToList(), reasonPhrase)
|
||||
{
|
||||
}
|
||||
|
||||
public HttpContent Content { get; }
|
||||
public HttpStatusCode StatusCode { get; }
|
||||
public List<Header> Headers { get; }
|
||||
public string ReasonPhrase {get;}
|
||||
}
|
||||
}
|
||||
|
@ -46,7 +46,7 @@ namespace Ocelot.Middleware.Multiplexer
|
||||
Headers = {ContentType = new MediaTypeHeaderValue("application/json")}
|
||||
};
|
||||
|
||||
originalContext.DownstreamResponse = new DownstreamResponse(stringContent, HttpStatusCode.OK, new List<KeyValuePair<string, IEnumerable<string>>>());
|
||||
originalContext.DownstreamResponse = new DownstreamResponse(stringContent, HttpStatusCode.OK, new List<KeyValuePair<string, IEnumerable<string>>>(), "cannot return from aggregate..which reason phrase would you use?");
|
||||
}
|
||||
|
||||
private static void MapAggregateError(DownstreamContext originalContext, List<DownstreamContext> downstreamContexts, int i)
|
||||
|
@ -3,6 +3,7 @@ using System.Linq;
|
||||
using System.Net;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Http.Features;
|
||||
using Microsoft.Extensions.Primitives;
|
||||
using Ocelot.Headers;
|
||||
using Ocelot.Middleware;
|
||||
@ -45,6 +46,8 @@ namespace Ocelot.Responder
|
||||
|
||||
context.Response.StatusCode = (int)response.StatusCode;
|
||||
|
||||
context.Response.HttpContext.Features.Get<IHttpResponseFeature>().ReasonPhrase = response.ReasonPhrase;
|
||||
|
||||
using(content)
|
||||
{
|
||||
if (response.StatusCode != HttpStatusCode.NotModified && context.Response.ContentLength != 0)
|
||||
|
Reference in New Issue
Block a user