diff --git a/src/Ocelot.Library/Middleware/HttpRequestBuilderMiddleware.cs b/src/Ocelot.Library/Middleware/HttpRequestBuilderMiddleware.cs new file mode 100644 index 00000000..1bb0d68a --- /dev/null +++ b/src/Ocelot.Library/Middleware/HttpRequestBuilderMiddleware.cs @@ -0,0 +1,48 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Ocelot.Library.Infrastructure.Repository; +using Ocelot.Library.Infrastructure.Requester; +using Ocelot.Library.Infrastructure.Responder; + +namespace Ocelot.Library.Middleware +{ + using Infrastructure.RequestBuilder; + + public class HttpRequestBuilderMiddleware + { + private readonly RequestDelegate _next; + private readonly IHttpResponder _responder; + private readonly IScopedRequestDataRepository _scopedRequestDataRepository; + private readonly IRequestBuilder _requestBuilder; + + public HttpRequestBuilderMiddleware(RequestDelegate next, + IHttpResponder responder, + IScopedRequestDataRepository scopedRequestDataRepository, + IRequestBuilder requestBuilder) + { + _next = next; + _responder = responder; + _scopedRequestDataRepository = scopedRequestDataRepository; + _requestBuilder = requestBuilder; + } + + public async Task Invoke(HttpContext context) + { + var downstreamUrl = _scopedRequestDataRepository.Get("DownstreamUrl"); + + if (downstreamUrl.IsError) + { + await _responder.CreateNotFoundResponse(context); + return; + } + + var request = _requestBuilder + .Build(context.Request.Method, downstreamUrl.Data, context.Request.Body, + context.Request.Headers, context.Request.Cookies, context.Request.QueryString.Value, context.Request.ContentType); + + _scopedRequestDataRepository.Add("Request", request); + + await _next.Invoke(context); + } + } +} \ No newline at end of file diff --git a/src/Ocelot.Library/Middleware/HttpRequestBuilderMiddlewareExtensions.cs b/src/Ocelot.Library/Middleware/HttpRequestBuilderMiddlewareExtensions.cs new file mode 100644 index 00000000..0b51ccaa --- /dev/null +++ b/src/Ocelot.Library/Middleware/HttpRequestBuilderMiddlewareExtensions.cs @@ -0,0 +1,12 @@ +using Microsoft.AspNetCore.Builder; + +namespace Ocelot.Library.Middleware +{ + public static class HttpRequestBuilderMiddlewareExtensions + { + public static IApplicationBuilder UseHttpRequestBuilderMiddleware(this IApplicationBuilder builder) + { + return builder.UseMiddleware(); + } + } +} \ No newline at end of file diff --git a/src/Ocelot.Library/Middleware/HttpRequesterMiddleware.cs b/src/Ocelot.Library/Middleware/HttpRequesterMiddleware.cs index ed585924..b5538df6 100644 --- a/src/Ocelot.Library/Middleware/HttpRequesterMiddleware.cs +++ b/src/Ocelot.Library/Middleware/HttpRequesterMiddleware.cs @@ -31,20 +31,16 @@ namespace Ocelot.Library.Middleware public async Task Invoke(HttpContext context) { - var downstreamUrl = _scopedRequestDataRepository.Get("DownstreamUrl"); + var request = _scopedRequestDataRepository.Get("Request"); - if (downstreamUrl.IsError) + if (request.IsError) { await _responder.CreateNotFoundResponse(context); return; } - var request = _requestBuilder - .Build(context.Request.Method, downstreamUrl.Data, context.Request.Body, - context.Request.Headers, context.Request.Cookies, context.Request.QueryString.Value, context.Request.ContentType); - var response = await _requester - .GetResponse(request); + .GetResponse(request.Data); await _responder.CreateResponse(context, response); diff --git a/src/Ocelot/Startup.cs b/src/Ocelot/Startup.cs index 0ff6b0e2..cb9e9e77 100644 --- a/src/Ocelot/Startup.cs +++ b/src/Ocelot/Startup.cs @@ -62,6 +62,8 @@ namespace Ocelot app.UserDownstreamUrlCreatorMiddleware(); + app.UseHttpRequestBuilderMiddleware(); + app.UseHttpRequesterMiddleware(); } }