Beispiel #1
0
        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);
                }
            }
        }
Beispiel #2
0
        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);
            }
        }
Beispiel #4
0
        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);
        }