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)); }
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; }
/// <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; }
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); }
/// <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); }
/// <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"); }
private static void UseSwaggerForOcelot(IApplicationBuilder app, SwaggerForOcelotUIOptions options) => app.Map(options.EndPointBasePath, builder => builder.UseMiddleware <SwaggerForOcelotMiddleware>(options));
private void SetupAction(SwaggerForOcelotUIOptions options) { options.PathToSwaggerGenerator = "/swagger/docs"; options.OAuthClientId(_config.GetValue <string>("Swagger:ClientId")); options.OAuthAppName("Riva Identity"); }