aspnetcore/test/Microsoft.AspNetCore.Dispat.../ApiAppStartup.cs

99 lines
3.8 KiB
C#

// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing.Dispatcher;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.Dispatcher.FunctionalTest
{
public class ApiAppStartup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddLogging();
services.AddDispatcher();
// This is a temporary layering issue, don't worry about it :)
services.AddRouting();
services.AddSingleton<IDefaultMatcherFactory, TreeMatcherFactory>();
services.Configure<DispatcherOptions>(ConfigureDispatcher);
}
public void Configure(IApplicationBuilder app, ILogger<ApiAppStartup> logger)
{
app.UseDispatcher();
app.Use(next => async (context) =>
{
logger.LogInformation("Executing fake CORS middleware");
var feature = context.Features.Get<IDispatcherFeature>();
var policy = feature.Endpoint?.Metadata.GetMetadata<CorsPolicyMetadata>();
logger.LogInformation("using CORS policy {PolicyName}", policy?.Name ?? "default");
await next(context);
});
app.Use(next => async (context) =>
{
logger.LogInformation("Executing fake AuthZ middleware");
var feature = context.Features.Get<IDispatcherFeature>();
var policy = feature.Endpoint?.Metadata.GetMetadata<AuthorizationPolicyMetadata>();
if (policy != null)
{
logger.LogInformation("using Auth policy {PolicyName}", policy.Name);
}
await next(context);
});
}
public void ConfigureDispatcher(DispatcherOptions options)
{
options.Matchers.Add(new TreeMatcher()
{
Endpoints =
{
new RoutePatternEndpoint("api/products", Products_Fallback),
new RoutePatternEndpoint("api/products", new { controller = "Products", action = "Get", }, "GET", Products_Get),
new RoutePatternEndpoint("api/products/{id}", new { controller = "Products", action = "Get", }, "GET", Products_GetWithId),
new RoutePatternEndpoint("api/products", new { controller = "Products", action = "Post", }, "POST", Products_Post),
new RoutePatternEndpoint("api/products/{id}", new { controller = "Products", action = "Put", }, "PUT", Products_Put),
},
Selectors =
{
new HttpMethodEndpointSelector(),
},
}, new RoutePatternEndpointHandlerFactory());
}
private Task Products_Fallback(HttpContext httpContext) => httpContext.Response.WriteAsync("Hello, Products_Fallback");
private Task Products_Get(HttpContext httpContext) => httpContext.Response.WriteAsync("Hello, Products_Get");
private Task Products_GetWithId(HttpContext httpContext) => httpContext.Response.WriteAsync("Hello, Products_GetWithId");
private Task Products_Post(HttpContext httpContext) => httpContext.Response.WriteAsync("Hello, Products_Post");
private Task Products_Put(HttpContext httpContext) => httpContext.Response.WriteAsync("Hello, Products_Put");
private class CorsPolicyMetadata
{
public string Name { get; set; }
}
private class AuthorizationPolicyMetadata
{
public string Name { get; set; }
}
}
}