using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Options; using Ocelot.Library.Infrastructure.Configuration; using Ocelot.Library.Infrastructure.DownstreamRouteFinder; using Ocelot.Library.Infrastructure.Requester; using Ocelot.Library.Infrastructure.Responder; using Ocelot.Library.Infrastructure.UrlTemplateReplacer; namespace Ocelot.Library.Middleware { public class ProxyMiddleware { private readonly RequestDelegate _next; private readonly IDownstreamUrlTemplateVariableReplacer _urlReplacer; private readonly IOptions _configuration; private readonly IDownstreamRouteFinder _downstreamRouteFinder; private readonly IHttpRequester _requester; private readonly IHttpResponder _responder; public ProxyMiddleware(RequestDelegate next, IDownstreamUrlTemplateVariableReplacer urlReplacer, IOptions configuration, IDownstreamRouteFinder downstreamRouteFinder, IHttpRequester requester, IHttpResponder responder) { _next = next; _urlReplacer = urlReplacer; _configuration = configuration; _downstreamRouteFinder = downstreamRouteFinder; _requester = requester; _responder = responder; } public async Task Invoke(HttpContext context) { var upstreamUrlPath = context.Request.Path.ToString(); var downstreamRoute = _downstreamRouteFinder.FindDownstreamRoute(upstreamUrlPath); if (downstreamRoute.IsError) { await _responder.CreateNotFoundResponse(context); return; } var downstreamUrl = _urlReplacer.ReplaceTemplateVariables(downstreamRoute.Data); var response = await _requester .GetResponse(context.Request.Method, downstreamUrl, context.Request.Body, context.Request.Headers, context.Request.Cookies, context.Request.Query, context.Request.ContentType); await _responder.CreateResponse(context, response); await _next.Invoke(context); } } }