public async Task Invoke(ITrafficContext trafficContext, BrolicTrafficDelegate next) { var endPoint = trafficContext.HttpContext.GetEndpoint(); endPoint.RequestDelegate(trafficContext.HttpContext); await next(trafficContext); }
public async Task Invoke(ITrafficContext trafficContext, BrolicTrafficDelegate next) { var routeContext = new RouteContext(trafficContext.HttpContext); routeContext.RouteData.Routers.Add(_router); await _router.RouteAsync(routeContext); await routeContext.Handler(routeContext.HttpContext); await next(trafficContext); }
public BrolicTrafficDelegate Build() { BrolicTrafficDelegate application = trafficContext => { trafficContext.HttpContext.Response.StatusCode = StatusCodes.Status404NotFound; return(Task.CompletedTask); }; foreach (var middleware in _middlewares.Reverse()) { application = middleware(application); } return(application); }
public async Task Invoke(ITrafficContext trafficContext, BrolicTrafficDelegate next) { var trafficInitiatorId = await _trafficInitiatorIdentifier.IdentifyTrafficInitiator(trafficContext); var httpContext = trafficContext.HttpContext; var httpMethod = httpContext.Request.Method; var rateLimitingRouteOptions = trafficContext.Route.GetRateLimitingRouteOptions(); var applicableRateLimitingRules = rateLimitingRouteOptions.Rules .Where(r => !r.Methods.Any() || r.Methods.Contains(httpMethod)); var rateLimitingValidationResponses = new List <RateLimitingValidationResponse>(); foreach (var applicableRateLimitingRule in applicableRateLimitingRules) { var path = httpContext.Request.Path; var parsedMethod = !applicableRateLimitingRule.Methods.Any() ? "Any" : applicableRateLimitingRule.Methods.Aggregate(string.Empty, (current, method) => { current += method; return(current); }); var rateLimitingValidationContext = new RateLimitingValidationContext { TrafficInitiatorId = trafficInitiatorId, Path = path, Method = parsedMethod, Limit = applicableRateLimitingRule.Limit, Period = applicableRateLimitingRule.Period }; var rateLimitingValidationResponse = await _rateLimitingValidationStrategy.ValidateContext(rateLimitingValidationContext); rateLimitingValidationResponses.Add(rateLimitingValidationResponse); } if (rateLimitingValidationResponses.Any(r => !r.IsValid)) { httpContext.Response.StatusCode = StatusCodes.Status429TooManyRequests; return; } await next(trafficContext); }
public async Task Invoke(ITrafficContext trafficContext, BrolicTrafficDelegate next) { var downstream = trafficContext.Downstream; var trafficHandler = _trafficHandlerProvider.GetTrafficHandler(downstream.Handler); await trafficHandler.HandleTraffic(trafficContext); }