private async Task LoadRouteDefinitionsAsync() { if (_routeTemplateCollection != null) { return; } using (_asyncLock.StartLockAsync()) { if (_routeTemplateCollection != null) { return; } _routeTemplateCollection = new RouteTemplateCollection <List <RouteDefinition> >(); var routeDefinitionUri = new Uri(_gatewayOptions.RouteDefinitionsUri, UriKind.RelativeOrAbsolute); var routeDefinitions = await _configurationRetriever.RetrieveRouteDefinitionsAsync <List <RouteDefinition> >(routeDefinitionUri); foreach (var routeDefinition in routeDefinitions) { var routeTemplateDefinitions = _routeTemplateCollection.Get(routeDefinition.RouteTemplate); if (routeTemplateDefinitions == null) { routeTemplateDefinitions = new List <RouteDefinition>(); _routeTemplateCollection.Add(routeDefinition.RouteTemplate, routeTemplateDefinitions); } routeTemplateDefinitions.Add(routeDefinition); } } }
private async Task LoadConnectionDefinitions() { if (_connectionDefinitions == null) { var connectionDefinitionsUri = new Uri(_restDbOptions.ConnectionDefinitionsUri, UriKind.RelativeOrAbsolute); _connectionDefinitions = await _configurationRetriever.RetrieveRouteDefinitionsAsync <Dictionary <string, ConnectionDefinition> >(connectionDefinitionsUri); } }
public async Task RetrieveRouteDefinition_MustBeCalled_Once_Test() { var httpContext = new DefaultHttpContext(); await _mockerMiddleware.InvokeAsync(httpContext); await _mockerMiddleware.InvokeAsync(httpContext); A.CallTo(() => _configurationRetriever.RetrieveRouteDefinitionsAsync <List <RouteDefinition> >(A <Uri> .Ignored)) .MustHaveHappenedOnceExactly(); }
public async Task InvokeAsync(HttpContext httpContext) { if (_routeTemplateCollection == null) { var routeDefinitionUri = new Uri(_mockerOptions.RouteDefinitionsUri, UriKind.RelativeOrAbsolute); var routeDefinitions = await _configurationRetriever.RetrieveRouteDefinitionsAsync <List <RouteDefinition> >(routeDefinitionUri); var routeTemplateCollection = new RouteTemplateCollection <RouteDefinition>(); foreach (var routeDefinition in routeDefinitions) { routeTemplateCollection.Add(routeDefinition.RouteTemplate, routeDefinition); } _routeTemplateCollection = routeTemplateCollection; } var match = _routeTemplateCollection.Match(httpContext.Request.Path); if (match?.Item.RouteMethods == null || !match.Item.RouteMethods.Contains(httpContext.Request.Method)) { await _next(httpContext); return; } await Task.Delay(match.Item.DelayInMilliseconds, httpContext.RequestAborted); httpContext.Response.StatusCode = match.Item.StatusCode; if (match.Item.Headers != null) { foreach (var header in match.Item.Headers) { httpContext.Response.Headers.TryAdd(header.Key, header.Value); } } var body = Encoding.UTF8.GetBytes(match.Item.Body); await httpContext.Response.Body.WriteAsync(body, httpContext.RequestAborted); _historyRepository.Add(new HistoryItem { RequestPath = httpContext.Request.Path, RequestQuery = httpContext.Request.Query.Select(q => new KeyValuePair <string, string>(q.Key, q.Value)).ToList(), RequestMethod = httpContext.Request.Method, RequestHeaders = httpContext.Request.Headers.Select(h => new KeyValuePair <string, string>(h.Key, h.Value.ToString())).ToList() }); }
public async Task Test() { var claimMappings = new Dictionary <string, string> { { "Claim1", "X-CLAIM-1" } }; var claims = new List <Claim> { new Claim("Claim1", "claim1-value") }; var httpContext = new DefaultHttpContext(); httpContext.Connection.RemoteIpAddress = IPAddress.Loopback; httpContext.Request.Path = "/"; httpContext.Request.Method = "GET"; httpContext.User = new ClaimsPrincipal(new ClaimsIdentity(claims, "basic")); A.CallTo(() => _configurationRetriever .RetrieveRouteDefinitionsAsync <List <RouteDefinition> >(A <Uri> .Ignored)) .Returns(new List <RouteDefinition> { new RouteDefinition { RouteTemplate = "/", ClaimMappings = claimMappings, RouteMethods = new List <string> { "GET" }, RouteEndpoints = new List <string> { "http://test-host" } } }); var routeDefinitionMatch = await _routeDefinitionMatcher.MatchAsync( httpContext.Request.Path.Value, httpContext.Request.Method); Assert.IsNotNull(routeDefinitionMatch); }