示例#1
0
        public async Task RespectDownstreamHttpVersionRouteSetting()
        {
            // Arrange
            const string version     = "v1";
            const string key         = "projects";
            HttpContext  httpContext = GetHttpContext(requestPath: $"/{version}/{key}");

            var next = new TestRequestDelegate();

            // What is being tested
            var swaggerForOcelotOptions = new SwaggerForOcelotUIOptions();
            TestSwaggerEndpointOptions swaggerEndpointOptions = CreateSwaggerEndpointOptions(key, version);
            var routeOptions = new TestRouteOptions(new List <RouteOptions>
            {
                new RouteOptions
                {
                    SwaggerKey             = "projects",
                    UpstreamPathTemplate   = "/api/projects/Projects",
                    DownstreamPathTemplate = "/api/Projects",
                    DownstreamHttpVersion  = "2.0",
                }
            });

            // downstreamSwagger is returned when client.GetStringAsync is called by the middleware.
            string downstreamSwagger = await GetBaseOpenApi("OpenApiWithVersionPlaceholderBase");

            HttpClient httClientMock     = GetHttpClient(downstreamSwagger);
            var        httpClientFactory = new TestHttpClientFactory(httClientMock);

            var swaggerJsonTransformerMock = new Mock <ISwaggerJsonTransformer>();

            swaggerJsonTransformerMock
            .Setup(x => x.Transform(
                       It.IsAny <string>(),
                       It.IsAny <IEnumerable <RouteOptions> >(),
                       It.IsAny <string>()))
            .Returns((
                         string swaggerJson,
                         IEnumerable <RouteOptions> routeOptions,
                         string serverOverride) => new SwaggerJsonTransformer()
                     .Transform(swaggerJson, routeOptions, serverOverride));
            var swaggerForOcelotMiddleware = new SwaggerForOcelotMiddleware(
                next.Invoke,
                swaggerForOcelotOptions,
                routeOptions,
                swaggerJsonTransformerMock.Object);

            // Act
            await swaggerForOcelotMiddleware.Invoke(
                httpContext,
                new SwaggerEndPointProvider(swaggerEndpointOptions, OcelotSwaggerGenOptions.Default),
                new DownstreamSwaggerDocsRepository(Microsoft.Extensions.Options.Options.Create(swaggerForOcelotOptions),
                                                    httpClientFactory, DummySwaggerServiceDiscoveryProvider.Default));

            httpContext.Response.Body.Seek(0, SeekOrigin.Begin);

            // Assert
            httClientMock.DefaultRequestVersion.Should().BeEquivalentTo(new Version(2, 0));
        }
示例#2
0
 private static void InitUIOption(SwaggerUIOptions c, SwaggerForOcelotUIOptions options)
 {
     c.ConfigObject      = options.ConfigObject;
     c.DocumentTitle     = options.DocumentTitle;
     c.HeadContent       = options.HeadContent;
     c.IndexStream       = options.IndexStream;
     c.OAuthConfigObject = options.OAuthConfigObject;
     c.RoutePrefix       = options.RoutePrefix;
 }
示例#3
0
 /// <summary>
 /// Initializes a new instance of the <see cref="SwaggerForOcelotMiddleware"/> class.
 /// </summary>
 /// <param name="next">The next delegate.</param>
 /// <param name="options">The options.</param>
 /// <param name="routes">The Ocelot Routes configuration.</param>
 /// <param name="swaggerEndPoints">The swagger end points.</param>
 /// <param name="httpClientFactory">The HTTP client factory.</param>
 /// <param name="transformer">The SwaggerJsonTransformer</param>
 public SwaggerForOcelotMiddleware(
     RequestDelegate next,
     SwaggerForOcelotUIOptions options,
     IOptions <List <RouteOptions> > routes,
     ISwaggerJsonTransformer transformer,
     ISwaggerDownstreamInterceptor downstreamInterceptor = null)
 {
     _transformer           = Check.NotNull(transformer, nameof(transformer));
     _next                  = Check.NotNull(next, nameof(next));
     _routes                = Check.NotNull(routes, nameof(routes));
     _options               = options;
     _downstreamInterceptor = downstreamInterceptor;
 }
示例#4
0
        public async Task AllowUserDefinedUpstreamTransformer()
        {
            // Arrange
            const string version     = "v1";
            const string key         = "projects";
            HttpContext  httpContext = GetHttpContext(requestPath: $"/{version}/{key}");

            var next = new TestRequestDelegate();

            // What is being tested
            var swaggerForOcelotOptions = new SwaggerForOcelotUIOptions()
            {
                ReConfigureUpstreamSwaggerJson = ExampleUserDefinedUpstreamTransformer
            };
            TestSwaggerEndpointOptions testSwaggerEndpointOptions = CreateSwaggerEndpointOptions(key, version);
            var routeOptions = new TestRouteOptions();

            // downstreamSwagger is returned when client.GetStringAsync is called by the middleware.
            string downstreamSwagger = await GetBaseOpenApi("OpenApiBase");

            HttpClient httClientMock     = GetHttpClient(downstreamSwagger);
            var        httpClientFactory = new TestHttpClientFactory(httClientMock);

            // upstreamSwagger is returned after swaggerJsonTransformer transforms the downstreamSwagger
            string upstreamSwagger = await GetBaseOpenApi("OpenApiBaseTransformed");

            var swaggerJsonTransformer = new TestSwaggerJsonTransformer(upstreamSwagger);

            var swaggerForOcelotMiddleware = new SwaggerForOcelotMiddleware(
                next.Invoke,
                swaggerForOcelotOptions,
                routeOptions,
                swaggerJsonTransformer,
                Substitute.For <ISwaggerProvider>());

            // Act
            await swaggerForOcelotMiddleware.Invoke(
                httpContext,
                new SwaggerEndPointProvider(testSwaggerEndpointOptions, OcelotSwaggerGenOptions.Default),
                new DownstreamSwaggerDocsRepository(Microsoft.Extensions.Options.Options.Create(swaggerForOcelotOptions),
                                                    httpClientFactory, DummySwaggerServiceDiscoveryProvider.Default));

            httpContext.Response.Body.Seek(0, SeekOrigin.Begin);
            string transformedUpstreamSwagger = await new StreamReader(httpContext.Response.Body).ReadToEndAsync();

            // Assert
            AreEqual(transformedUpstreamSwagger, upstreamSwagger);
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="SwaggerForOcelotMiddleware"/> class.
        /// </summary>
        /// <param name="next">The next delegate.</param>
        /// <param name="options">The options.</param>
        /// <param name="reRoutes">The Ocelot ReRoutes configuration.</param>
        /// <param name="swaggerEndPoints">The swagger end points.</param>
        /// <param name="httpClientFactory">The HTTP client factory.</param>
        public SwaggerForOcelotMiddleware(
            RequestDelegate next,
            SwaggerForOcelotUIOptions options,
            IOptions <List <ReRouteOptions> > reRoutes,
            IOptions <List <SwaggerEndPointOptions> > swaggerEndPoints,
            IHttpClientFactory httpClientFactory,
            ISwaggerJsonTransformer transformer)
        {
            _transformer = Check.NotNull(transformer, nameof(transformer));
            _next        = Check.NotNull(next, nameof(next));
            _reRoutes    = Check.NotNull(reRoutes, nameof(reRoutes));
            Check.NotNull(swaggerEndPoints, nameof(swaggerEndPoints));
            _httpClientFactory = Check.NotNull(httpClientFactory, nameof(httpClientFactory));

            _swaggerEndPoints = new Lazy <Dictionary <string, SwaggerEndPointOptions> >(()
                                                                                        => swaggerEndPoints.Value.ToDictionary(p => $"/{p.KeyToPath}", p => p));
        }
        public async Task AllowUserDefinedUpstreamTransformer()
        {
            // Arrange
            const string version     = "v1";
            const string key         = "projects";
            HttpContext  httpContext = GetHttpContext(requestPath: $"/{version}/{key}");

            var next = new TestRequestDelegate();

            // What is being tested
            var swaggerForOcelotOptions = new SwaggerForOcelotUIOptions()
            {
                ReConfigureUpstreamSwaggerJson = ExampleUserDefinedUpstreamTransformer
            };
            TestSwaggerEndpointOptions testSwaggerEndpointOptions = CreateSwaggerEndpointOptions(key, version);
            var rerouteOptions = new TestReRouteOptions();

            // downstreamSwagger is returned when client.GetStringAsync is called by the middleware.
            string downstreamSwagger = await GetBaseOpenApi("OpenApiBase");

            HttpClient httClientMock     = GetHttpClient(downstreamSwagger);
            var        httpClientFactory = new TestHttpClientFactory(httClientMock);

            // upstreamSwagger is returned after swaggerJsonTransformer transforms the downstreamSwagger
            string upstreamSwagger = await GetBaseOpenApi("OpenApiBaseTransformed");

            var swaggerJsonTransformer = new TestSwaggerJsonTransformer(upstreamSwagger);

            var swaggerForOcelotMiddleware = new SwaggerForOcelotMiddleware(
                next.Invoke,
                swaggerForOcelotOptions,
                rerouteOptions,
                testSwaggerEndpointOptions,
                httpClientFactory,
                swaggerJsonTransformer);

            // Act
            await swaggerForOcelotMiddleware.Invoke(httpContext);

            httpContext.Response.Body.Seek(0, SeekOrigin.Begin);
            string transformedUpstreamSwagger = await new StreamReader(httpContext.Response.Body).ReadToEndAsync();

            // Assert
            AreEqual(transformedUpstreamSwagger, upstreamSwagger);
        }
示例#7
0
        /// <summary>
        /// Add Swagger generator for downstream services and UI into application pipeline.
        /// </summary>
        /// <param name="app">The application builder.</param>
        /// <param name="setupAction">Setup <see cref="SwaggerForOcelotUIOptions"/></param>
        /// <returns>
        /// <see cref="IApplicationBuilder"/>.
        /// </returns>
        public static IApplicationBuilder UseSwaggerForOcelotUI(
            this IApplicationBuilder app,
            Action <SwaggerForOcelotUIOptions> setupAction = null)
        {
            SwaggerForOcelotUIOptions options = app.ApplicationServices.GetService <IOptions <SwaggerForOcelotUIOptions> >().Value;

            setupAction?.Invoke(options);
            UseSwaggerForOcelot(app, options);

            app.UseSwaggerUI(c =>
            {
                InitUIOption(c, options);
                IReadOnlyList <SwaggerEndPointOptions> endPoints = app.ApplicationServices.GetService <IOptions <List <SwaggerEndPointOptions> > >().Value;
                AddSwaggerEndPoints(c, endPoints, options.DownstreamSwaggerEndPointBasePath);
            });

            return(app);
        }
示例#8
0
        /// <summary>
        /// Add Swagger generator for downstream services and UI into application pipeline.
        /// </summary>
        /// <param name="app">The application builder.</param>
        /// <param name="configuration">The configuration.</param>
        /// <param name="setupAction">Setup <see cref="SwaggerForOcelotUIOptions"/></param>
        /// <returns>
        /// <see cref="IApplicationBuilder"/>.
        /// </returns>
        public static IApplicationBuilder UseSwaggerForOcelotUI(
            this IApplicationBuilder app,
            IConfiguration configuration,
            Action <SwaggerForOcelotUIOptions> setupAction)
        {
            var options = new SwaggerForOcelotUIOptions();

            setupAction?.Invoke(options);
            UseSwaggerForOcelot(app, options);

            app.UseSwaggerUI(c =>
            {
                InitUIOption(c, options);
                var endPoints = GetConfiguration(configuration);
                AddSwaggerEndPoints(c, endPoints, options.EndPointBasePath);
            });

            return(app);
        }
        public async Task AllowVersionPlaceholder()
        {
            // Arrange
            const string version     = "v1";
            const string key         = "projects";
            HttpContext  httpContext = GetHttpContext(requestPath: $"/{version}/{key}");

            var next = new TestRequestDelegate();

            // What is being tested
            var swaggerForOcelotOptions = new SwaggerForOcelotUIOptions();
            TestSwaggerEndpointOptions swaggerEndpointOptions = CreateSwaggerEndpointOptions(key, version);
            var rerouteOptions = new TestReRouteOptions(new List <ReRouteOptions>
            {
                new ReRouteOptions
                {
                    SwaggerKey             = "projects",
                    UpstreamPathTemplate   = "/api/{version}/projects/Values/{everything}",
                    DownstreamPathTemplate = "/api/{version}/Values/{everything}",
                },
                new ReRouteOptions
                {
                    SwaggerKey             = "projects",
                    UpstreamPathTemplate   = "/api/projects/Projects",
                    DownstreamPathTemplate = "/api/Projects",
                },
                new ReRouteOptions
                {
                    SwaggerKey             = "projects",
                    UpstreamPathTemplate   = "/api/projects/Projects/{everything}",
                    DownstreamPathTemplate = "/api/Projects/{everything}",
                }
            });

            // downstreamSwagger is returned when client.GetStringAsync is called by the middleware.
            string downstreamSwagger = await GetBaseOpenApi("OpenApiWithVersionPlaceholderBase");

            HttpClient httClientMock     = GetHttpClient(downstreamSwagger);
            var        httpClientFactory = new TestHttpClientFactory(httClientMock);

            // upstreamSwagger is returned after swaggerJsonTransformer transforms the downstreamSwagger
            string expectedSwagger = await GetBaseOpenApi("OpenApiWithVersionPlaceholderBaseTransformed");

            var swaggerJsonTransformerMock = new Mock <ISwaggerJsonTransformer>();

            swaggerJsonTransformerMock
            .Setup(x => x.Transform(
                       It.IsAny <string>(),
                       It.IsAny <IEnumerable <ReRouteOptions> >(),
                       It.IsAny <string>()))
            .Returns((
                         string swaggerJson,
                         IEnumerable <ReRouteOptions> reRouteOptions,
                         string serverOverride) => new SwaggerJsonTransformer()
                     .Transform(swaggerJson, reRouteOptions, serverOverride));
            var swaggerForOcelotMiddleware = new SwaggerForOcelotMiddleware(
                next.Invoke,
                swaggerForOcelotOptions,
                rerouteOptions,
                swaggerEndpointOptions,
                httpClientFactory,
                swaggerJsonTransformerMock.Object);

            // Act
            await swaggerForOcelotMiddleware.Invoke(httpContext, DummySwaggerServiceDiscoveryProvider.Default);

            httpContext.Response.Body.Seek(0, SeekOrigin.Begin);

            // Assert
            using (var streamReader = new StreamReader(httpContext.Response.Body))
            {
                string transformedUpstreamSwagger = await streamReader.ReadToEndAsync();

                AreEqual(transformedUpstreamSwagger, expectedSwagger);
            }
            swaggerJsonTransformerMock.Verify(x => x.Transform(
                                                  It.IsAny <string>(),
                                                  It.IsAny <IEnumerable <ReRouteOptions> >(),
                                                  It.IsAny <string>()), Times.Once);
        }
 private static void UseSwaggerForOcelot(IApplicationBuilder app, SwaggerForOcelotUIOptions options)
 => app.Map(options.PathToSwaggerGenerator, builder => builder.UseMiddleware <SwaggerForOcelotMiddleware>(options));
        public async Task AllowUserDefinedUpstreamTransformer()
        {
            // Arrange
            const string version     = "v1";
            const string key         = "test";
            var          httpContext = GetHttpContext(requestPath: $"/{version}/{key}");

            var next = new TestRequestDelegate();

            // What is being tested
            var swaggerForOcelotOptions = new SwaggerForOcelotUIOptions()
            {
                ReConfigureUpstreamSwaggerJson = ExampleUserDefinedUpstreamTransformer
            };

            var rerouteOptions = new TestReRouteOptions();

            var swaggerEndpointOptions = new TestSwaggerEndpointOptions(
                new List <SwaggerEndPointOptions>()
            {
                new SwaggerEndPointOptions()
                {
                    Key    = key,
                    Config = new List <SwaggerEndPointConfig>()
                    {
                        new SwaggerEndPointConfig()
                        {
                            Name    = "Test Service",
                            Version = version,
                            Url     = $"http://test.com/{version}/{key}/swagger.json"
                        }
                    }
                }
            });

            // downstreamSwagger is returned when client.GetStringAsync is called by the middleware.
            var downstreamSwagger = await GetBaseOpenApi("OpenApiBase");

            var httClientMock     = GetHttpClient(downstreamSwagger);
            var httpClientFactory = new TestHttpClientFactory(httClientMock);

            // upstreamSwagger is returned after swaggerJsonTransformer transforms the downstreamSwagger
            var upstreamSwagger = await GetBaseOpenApi("OpenApiBaseTransformed");

            var swaggerJsonTransformer = new TestSwaggerJsonTransformer(upstreamSwagger);

            var swaggerForOcelotMiddleware = new SwaggerForOcelotMiddleware(
                next.Invoke,
                swaggerForOcelotOptions,
                rerouteOptions,
                swaggerEndpointOptions,
                httpClientFactory,
                swaggerJsonTransformer);

            // Act
            await swaggerForOcelotMiddleware.Invoke(httpContext);

            httpContext.Response.Body.Seek(0, SeekOrigin.Begin);
            var transformedUpstreamSwagger = await new StreamReader(httpContext.Response.Body).ReadToEndAsync();

            // Assert
            await AreEqual(transformedUpstreamSwagger, "OpenApiBaseTransformedReconfigured");
        }
示例#12
0
 private static void UseSwaggerForOcelot(IApplicationBuilder app, SwaggerForOcelotUIOptions options)
 => app.Map(options.EndPointBasePath, builder => builder.UseMiddleware <SwaggerForOcelotMiddleware>(options));
示例#13
0
 private void SetupAction(SwaggerForOcelotUIOptions options)
 {
     options.PathToSwaggerGenerator = "/swagger/docs";
     options.OAuthClientId(_config.GetValue <string>("Swagger:ClientId"));
     options.OAuthAppName("Riva Identity");
 }