private void ProcessWithInnerSwaggerForManyDestinationDownstream( ReRouteOptions route, SwaggerDescriptor descriptor, OpenApiDocument innerDocument) { var version = descriptor.Version.ToString(); var upstreamTemplate = RemoveEverything(ReplaceVersion(route.UpstreamPathTemplate, version)); var downstreamTemplate = RemoveEverything(ReplaceVersion(route.DownstreamPathTemplate, version)); var reRoutedPaths = innerDocument.Paths .Select(p => new { path = ReplaceVersion(p.Key, version), openApiPathItem = p.Value }) .Where(p => p.path.StartsWith(downstreamTemplate, StringComparison.OrdinalIgnoreCase)) .ToDictionary(p => p.path.Replace(downstreamTemplate, upstreamTemplate), p => p.openApiPathItem); foreach (var path in reRoutedPaths) { var operations = GetOperationsForPath(route, path.Value); if (operations != null) { AddAuth(route, operations); AddOperations(path.Key, operations); } } }
private void ProcessWithInnerSwaggerForSingleDestinationDownstream( ReRouteOptions route, SwaggerDescriptor descriptor, OpenApiDocument innerDocument) { var version = descriptor.Version.ToString(); var upstreamTemplate = ReplaceVersion(route.UpstreamPathTemplate, version); var downstreamTemplate = ReplaceVersion(route.DownstreamPathTemplate, version); if (!innerDocument.Paths .Select(s => ReplaceVersion(s.Key, version).ToLower()) .Contains(downstreamTemplate.ToLower())) { return; } var path = innerDocument.Paths.FirstOrDefault(p => string.Equals( ReplaceVersion(p.Key, version), downstreamTemplate, StringComparison.CurrentCultureIgnoreCase)); var operations = GetOperationsForPath(route, path.Value); if (operations != null) { AddAuth(route, operations); AddOperations(upstreamTemplate, operations); } }
private async Task <(SwaggerDescriptor, OpenApiDocument)> LoadSwaggerAsync(string key, SwaggerEndPointConfig endpoint) { var descriptor = new SwaggerDescriptor(key, endpoint.Version); try { var swaggerJson = await _client.GetStringAsync(endpoint.Url); var openApi = new OpenApiStringReader().Read(swaggerJson, out _); return(descriptor, openApi); } catch (Exception e) { _logger.LogWarning(e, $"Can't load downstream swagger {endpoint.Url}"); return(descriptor, null); } }
private void ProcessWithInnerSwagger( ReRouteOptions route, SwaggerDescriptor descriptor, OpenApiDocument innerDocument) { if (!route.DownstreamPathTemplate.Contains(Constants.EverythingAnchor)) { ProcessWithInnerSwaggerForSingleDestinationDownstream(route, descriptor, innerDocument); return; } if (!route.UpstreamPathTemplate.Contains(Constants.EverythingAnchor)) { throw new InvalidOperationException( $"Can't map upstream ({route.UpstreamPathTemplate}) to downstream ({route.DownstreamPathTemplate})"); } ProcessWithInnerSwaggerForManyDestinationDownstream(route, descriptor, innerDocument); }