[Fixes #367] Add extensions on WebHostBuilder for super simple HTTP service application building

This commit is contained in:
Kiran Challa 2016-12-12 12:27:15 -08:00
parent 45247e4d9c
commit 20967cfa76
8 changed files with 351 additions and 92 deletions

View File

@ -0,0 +1,50 @@
// 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;
using System.Text.RegularExpressions;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing;
using Microsoft.AspNetCore.Routing.Constraints;
using Microsoft.Extensions.DependencyInjection;
namespace RoutingSample.Web
{
public class Program
{
private static readonly TimeSpan RegexMatchTimeout = TimeSpan.FromSeconds(10);
public static void Main(string[] args)
{
var webHost = GetWebHostBuilder().Build();
webHost.Run();
}
// For unit testing
public static IWebHostBuilder GetWebHostBuilder()
{
return new WebHostBuilder()
.UseKestrel()
.UseIISIntegration()
.ConfigureServices(services => services.AddRouting())
.Configure(app => app.UseRouter(routes =>
{
routes.DefaultHandler = new RouteHandler((httpContext) =>
{
var request = httpContext.Request;
return httpContext.Response.WriteAsync($"Verb = {request.Method.ToUpperInvariant()} - Path = {request.Path} - Route values - {string.Join(", ", httpContext.GetRouteData().Values)}");
});
routes.MapGet("api/get/{id}", (request, response, routeData) => response.WriteAsync($"API Get {routeData.Values["id"]}"))
.MapMiddlewareRoute("api/middleware", (appBuilder) => appBuilder.Use((httpContext, next) => httpContext.Response.WriteAsync("Middleware!")))
.MapRoute(
name: "AllVerbs",
template: "api/all/{name}/{lastName?}",
defaults: new { lastName = "Doe" },
constraints: new { lastName = new RegexRouteConstraint(new Regex("[a-zA-Z]{3}", RegexOptions.CultureInvariant, RegexMatchTimeout)) });
}));
}
}
}

View File

@ -1,56 +0,0 @@
// 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;
using System.Text.RegularExpressions;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing;
using Microsoft.AspNetCore.Routing.Constraints;
using Microsoft.Extensions.DependencyInjection;
namespace RoutingSample.Web
{
public class Startup
{
private static readonly TimeSpan RegexMatchTimeout = TimeSpan.FromSeconds(10);
public void ConfigureServices(IServiceCollection services)
{
services.AddRouting();
}
public void Configure(IApplicationBuilder app)
{
app.UseRouter(routes =>
{
routes.DefaultHandler = new RouteHandler((c) =>
{
return c.Response.WriteAsync($"Verb = {c.Request.Method.ToUpperInvariant()} - Path = {c.Request.Path} - Route values - {string.Join(", ", c.GetRouteData().Values)}");
});
routes.MapGet("api/get/{id}", (c) => c.Response.WriteAsync($"API Get {c.GetRouteData().Values["id"]}"));
routes.MapRoute("api/middleware", (IApplicationBuilder fork) => fork.Use((c, n) => c.Response.WriteAsync("Middleware!")));
routes.MapRoute(
name: "AllVerbs",
template: "api/all/{name}/{lastName?}",
defaults: new { lastName = "Doe" },
constraints: new { lastName = new RegexRouteConstraint(new Regex("[a-zA-Z]{3}", RegexOptions.CultureInvariant, RegexMatchTimeout))});
});
}
public static void Main(string[] args)
{
var host = new WebHostBuilder()
.UseKestrel()
.UseIISIntegration()
.UseStartup<Startup>()
.Build();
host.Run();
}
}
}

View File

@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing.Constraints;
@ -41,7 +42,7 @@ namespace Microsoft.AspNetCore.Routing
/// <param name="template">The route template.</param>
/// <param name="action">The action to apply to the <see cref="IApplicationBuilder"/>.</param>
/// <returns>A reference to the <paramref name="builder"/> after this operation has completed.</returns>
public static IRouteBuilder MapRoute(this IRouteBuilder builder, string template, Action<IApplicationBuilder> action)
public static IRouteBuilder MapMiddlewareRoute(this IRouteBuilder builder, string template, Action<IApplicationBuilder> action)
{
var nested = builder.ApplicationBuilder.New();
action(nested);
@ -69,9 +70,25 @@ namespace Microsoft.AspNetCore.Routing
/// <param name="template">The route template.</param>
/// <param name="action">The action to apply to the <see cref="IApplicationBuilder"/>.</param>
/// <returns>A reference to the <paramref name="builder"/> after this operation has completed.</returns>
public static IRouteBuilder MapDelete(this IRouteBuilder builder, string template, Action<IApplicationBuilder> action)
public static IRouteBuilder MapMiddlewareDelete(this IRouteBuilder builder, string template, Action<IApplicationBuilder> action)
{
return builder.MapVerb("DELETE", template, action);
return builder.MapMiddlewareVerb("DELETE", template, action);
}
/// <summary>
/// Adds a route to the <see cref="IRouteBuilder"/> that only matches HTTP DELETE requests for the given
/// <paramref name="template"/>, and <paramref name="handler"/>.
/// </summary>
/// <param name="builder">The <see cref="IRouteBuilder"/>.</param>
/// <param name="template">The route template.</param>
/// <param name="handler">The route handler.</param>
/// <returns>A reference to the <paramref name="builder"/> after this operation has completed.</returns>
public static IRouteBuilder MapDelete(
this IRouteBuilder builder,
string template,
Func<HttpRequest, HttpResponse, RouteData, Task> handler)
{
return builder.MapVerb("DELETE", template, handler);
}
/// <summary>
@ -95,9 +112,25 @@ namespace Microsoft.AspNetCore.Routing
/// <param name="template">The route template.</param>
/// <param name="action">The action to apply to the <see cref="IApplicationBuilder"/>.</param>
/// <returns>A reference to the <paramref name="builder"/> after this operation has completed.</returns>
public static IRouteBuilder MapGet(this IRouteBuilder builder, string template, Action<IApplicationBuilder> action)
public static IRouteBuilder MapMiddlewareGet(this IRouteBuilder builder, string template, Action<IApplicationBuilder> action)
{
return builder.MapVerb("GET", template, action);
return builder.MapMiddlewareVerb("GET", template, action);
}
/// <summary>
/// Adds a route to the <see cref="IRouteBuilder"/> that only matches HTTP GET requests for the given
/// <paramref name="template"/>, and <paramref name="handler"/>.
/// </summary>
/// <param name="builder">The <see cref="IRouteBuilder"/>.</param>
/// <param name="template">The route template.</param>
/// <param name="handler">The route handler.</param>
/// <returns>A reference to the <paramref name="builder"/> after this operation has completed.</returns>
public static IRouteBuilder MapGet(
this IRouteBuilder builder,
string template,
Func<HttpRequest, HttpResponse, RouteData, Task> handler)
{
return builder.MapVerb("GET", template, handler);
}
/// <summary>
@ -121,9 +154,25 @@ namespace Microsoft.AspNetCore.Routing
/// <param name="template">The route template.</param>
/// <param name="action">The action to apply to the <see cref="IApplicationBuilder"/>.</param>
/// <returns>A reference to the <paramref name="builder"/> after this operation has completed.</returns>
public static IRouteBuilder MapPost(this IRouteBuilder builder, string template, Action<IApplicationBuilder> action)
public static IRouteBuilder MapMiddlewarePost(this IRouteBuilder builder, string template, Action<IApplicationBuilder> action)
{
return builder.MapVerb("POST", template, action);
return builder.MapMiddlewareVerb("POST", template, action);
}
/// <summary>
/// Adds a route to the <see cref="IRouteBuilder"/> that only matches HTTP POST requests for the given
/// <paramref name="template"/>, and <paramref name="handler"/>.
/// </summary>
/// <param name="builder">The <see cref="IRouteBuilder"/>.</param>
/// <param name="template">The route template.</param>
/// <param name="handler">The route handler.</param>
/// <returns>A reference to the <paramref name="builder"/> after this operation has completed.</returns>
public static IRouteBuilder MapPost(
this IRouteBuilder builder,
string template,
Func<HttpRequest, HttpResponse, RouteData, Task> handler)
{
return builder.MapVerb("POST", template, handler);
}
/// <summary>
@ -147,9 +196,48 @@ namespace Microsoft.AspNetCore.Routing
/// <param name="template">The route template.</param>
/// <param name="action">The action to apply to the <see cref="IApplicationBuilder"/>.</param>
/// <returns>A reference to the <paramref name="builder"/> after this operation has completed.</returns>
public static IRouteBuilder MapPut(this IRouteBuilder builder, string template, Action<IApplicationBuilder> action)
public static IRouteBuilder MapMiddlewarePut(this IRouteBuilder builder, string template, Action<IApplicationBuilder> action)
{
return builder.MapVerb("PUT", template, action);
return builder.MapMiddlewareVerb("PUT", template, action);
}
/// <summary>
/// Adds a route to the <see cref="IRouteBuilder"/> that only matches HTTP PUT requests for the given
/// <paramref name="template"/>, and <paramref name="handler"/>.
/// </summary>
/// <param name="builder">The <see cref="IRouteBuilder"/>.</param>
/// <param name="template">The route template.</param>
/// <param name="handler">The route handler.</param>
/// <returns>A reference to the <paramref name="builder"/> after this operation has completed.</returns>
public static IRouteBuilder MapPut(
this IRouteBuilder builder,
string template,
Func<HttpRequest, HttpResponse, RouteData, Task> handler)
{
return builder.MapVerb("PUT", template, handler);
}
/// <summary>
/// Adds a route to the <see cref="IRouteBuilder"/> that only matches HTTP requests for the given
/// <paramref name="verb"/>, <paramref name="template"/>, and <paramref name="handler"/>.
/// </summary>
/// <param name="builder">The <see cref="IRouteBuilder"/>.</param>
/// <param name="verb">The HTTP verb allowed by the route.</param>
/// <param name="template">The route template.</param>
/// <param name="handler">The route handler.</param>
/// <returns>A reference to the <paramref name="builder"/> after this operation has completed.</returns>
public static IRouteBuilder MapVerb(
this IRouteBuilder builder,
string verb,
string template,
Func<HttpRequest, HttpResponse, RouteData, Task> handler)
{
RequestDelegate requestDelegate = (httpContext) =>
{
return handler(httpContext.Request, httpContext.Response, httpContext.GetRouteData());
};
return builder.MapVerb(verb, template, requestDelegate);
}
/// <summary>
@ -188,7 +276,7 @@ namespace Microsoft.AspNetCore.Routing
/// <param name="template">The route template.</param>
/// <param name="action">The action to apply to the <see cref="IApplicationBuilder"/>.</param>
/// <returns>A reference to the <paramref name="builder"/> after this operation has completed.</returns>
public static IRouteBuilder MapVerb(
public static IRouteBuilder MapMiddlewareVerb(
this IRouteBuilder builder,
string verb,
string template,

View File

@ -0,0 +1,32 @@
[
{
"OldTypeId": "public static class Microsoft.AspNetCore.Routing.RequestDelegateRouteBuilderExtensions",
"OldMemberId": "public static Microsoft.AspNetCore.Routing.IRouteBuilder MapRoute(this Microsoft.AspNetCore.Routing.IRouteBuilder builder, System.String template, System.Action<Microsoft.AspNetCore.Builder.IApplicationBuilder> action)",
"Kind": "Removal"
},
{
"OldTypeId": "public static class Microsoft.AspNetCore.Routing.RequestDelegateRouteBuilderExtensions",
"OldMemberId": "public static Microsoft.AspNetCore.Routing.IRouteBuilder MapGet(this Microsoft.AspNetCore.Routing.IRouteBuilder builder, System.String template, System.Action<Microsoft.AspNetCore.Builder.IApplicationBuilder> action)",
"Kind": "Removal"
},
{
"OldTypeId": "public static class Microsoft.AspNetCore.Routing.RequestDelegateRouteBuilderExtensions",
"OldMemberId": "public static Microsoft.AspNetCore.Routing.IRouteBuilder MapPost(this Microsoft.AspNetCore.Routing.IRouteBuilder builder, System.String template, System.Action<Microsoft.AspNetCore.Builder.IApplicationBuilder> action)",
"Kind": "Removal"
},
{
"OldTypeId": "public static class Microsoft.AspNetCore.Routing.RequestDelegateRouteBuilderExtensions",
"OldMemberId": "public static Microsoft.AspNetCore.Routing.IRouteBuilder MapPut(this Microsoft.AspNetCore.Routing.IRouteBuilder builder, System.String template, System.Action<Microsoft.AspNetCore.Builder.IApplicationBuilder> action)",
"Kind": "Removal"
},
{
"OldTypeId": "public static class Microsoft.AspNetCore.Routing.RequestDelegateRouteBuilderExtensions",
"OldMemberId": "public static Microsoft.AspNetCore.Routing.IRouteBuilder MapDelete(this Microsoft.AspNetCore.Routing.IRouteBuilder builder, System.String template, System.Action<Microsoft.AspNetCore.Builder.IApplicationBuilder> action)",
"Kind": "Removal"
},
{
"OldTypeId": "public static class Microsoft.AspNetCore.Routing.RequestDelegateRouteBuilderExtensions",
"OldMemberId": "public static Microsoft.AspNetCore.Routing.IRouteBuilder MapVerb(this Microsoft.AspNetCore.Routing.IRouteBuilder builder, System.String verb, System.String template, System.Action<Microsoft.AspNetCore.Builder.IApplicationBuilder> action)",
"Kind": "Removal"
}
]

View File

@ -0,0 +1,32 @@
[
{
"OldTypeId": "public static class Microsoft.AspNetCore.Routing.RequestDelegateRouteBuilderExtensions",
"OldMemberId": "public static Microsoft.AspNetCore.Routing.IRouteBuilder MapRoute(this Microsoft.AspNetCore.Routing.IRouteBuilder builder, System.String template, System.Action<Microsoft.AspNetCore.Builder.IApplicationBuilder> action)",
"Kind": "Removal"
},
{
"OldTypeId": "public static class Microsoft.AspNetCore.Routing.RequestDelegateRouteBuilderExtensions",
"OldMemberId": "public static Microsoft.AspNetCore.Routing.IRouteBuilder MapGet(this Microsoft.AspNetCore.Routing.IRouteBuilder builder, System.String template, System.Action<Microsoft.AspNetCore.Builder.IApplicationBuilder> action)",
"Kind": "Removal"
},
{
"OldTypeId": "public static class Microsoft.AspNetCore.Routing.RequestDelegateRouteBuilderExtensions",
"OldMemberId": "public static Microsoft.AspNetCore.Routing.IRouteBuilder MapPost(this Microsoft.AspNetCore.Routing.IRouteBuilder builder, System.String template, System.Action<Microsoft.AspNetCore.Builder.IApplicationBuilder> action)",
"Kind": "Removal"
},
{
"OldTypeId": "public static class Microsoft.AspNetCore.Routing.RequestDelegateRouteBuilderExtensions",
"OldMemberId": "public static Microsoft.AspNetCore.Routing.IRouteBuilder MapPut(this Microsoft.AspNetCore.Routing.IRouteBuilder builder, System.String template, System.Action<Microsoft.AspNetCore.Builder.IApplicationBuilder> action)",
"Kind": "Removal"
},
{
"OldTypeId": "public static class Microsoft.AspNetCore.Routing.RequestDelegateRouteBuilderExtensions",
"OldMemberId": "public static Microsoft.AspNetCore.Routing.IRouteBuilder MapDelete(this Microsoft.AspNetCore.Routing.IRouteBuilder builder, System.String template, System.Action<Microsoft.AspNetCore.Builder.IApplicationBuilder> action)",
"Kind": "Removal"
},
{
"OldTypeId": "public static class Microsoft.AspNetCore.Routing.RequestDelegateRouteBuilderExtensions",
"OldMemberId": "public static Microsoft.AspNetCore.Routing.IRouteBuilder MapVerb(this Microsoft.AspNetCore.Routing.IRouteBuilder builder, System.String verb, System.String template, System.Action<Microsoft.AspNetCore.Builder.IApplicationBuilder> action)",
"Kind": "Removal"
}
]

View File

@ -1,21 +1,27 @@
// 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;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.AspNetCore.TestHost;
using Xunit;
namespace Microsoft.AspNetCore.Routing.FunctionalTests
{
public class RoutingSampleTest : IClassFixture<RoutingTestFixture<RoutingSample.Web.Startup>>
public class RoutingSampleTest : IDisposable
{
public RoutingSampleTest(RoutingTestFixture<RoutingSample.Web.Startup> fixture)
{
Client = fixture.Client;
}
private readonly HttpClient _client;
private readonly TestServer _testServer;
public HttpClient Client { get; }
public RoutingSampleTest()
{
var webHostBuilder = RoutingSample.Web.Program.GetWebHostBuilder();
_testServer = new TestServer(webHostBuilder);
_client = _testServer.CreateClient();
_client.BaseAddress = new Uri("http://localhost");
}
[Fact]
public async Task Routing_CanRouteRequestDelegate_ToSpecificHttpVerb()
@ -24,7 +30,7 @@ namespace Microsoft.AspNetCore.Routing.FunctionalTests
var message = new HttpRequestMessage(HttpMethod.Get, "api/get/5");
// Act
var response = await Client.SendAsync(message);
var response = await _client.SendAsync(message);
// Assert
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
@ -38,7 +44,7 @@ namespace Microsoft.AspNetCore.Routing.FunctionalTests
var message = new HttpRequestMessage(HttpMethod.Get, "api/middleware");
// Act
var response = await Client.SendAsync(message);
var response = await _client.SendAsync(message);
// Assert
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
@ -60,7 +66,7 @@ namespace Microsoft.AspNetCore.Routing.FunctionalTests
var expectedBody = $"Verb = {httpVerb} - Path = /api/all/Joe/Duf - Route values - [name, Joe], [lastName, Duf]";
// Act
var response = await Client.SendAsync(message);
var response = await _client.SendAsync(message);
// Assert
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
@ -68,5 +74,11 @@ namespace Microsoft.AspNetCore.Routing.FunctionalTests
var body = await response.Content.ReadAsStringAsync();
Assert.Equal(expectedBody, body);
}
public void Dispose()
{
_testServer.Dispose();
_client.Dispose();
}
}
}

View File

@ -0,0 +1,101 @@
// 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;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.TestHost;
using Microsoft.Extensions.DependencyInjection;
using Xunit;
namespace Microsoft.AspNetCore.Routing.FunctionalTests
{
public class WebHostBuilderExtensionsTest
{
public static TheoryData<Action<IRouteBuilder>, HttpRequestMessage, string> MatchesRequest
{
get
{
return new TheoryData<Action<IRouteBuilder>, HttpRequestMessage, string>()
{
{
(rb) => rb.MapGet("greeting/{name}", (req, resp, routeData) => resp.WriteAsync($"Hello! {routeData.Values["name"]}")),
new HttpRequestMessage(HttpMethod.Get, "greeting/James"),
"Hello! James"
},
{
(rb) => rb.MapPost(
"greeting/{name}",
async (req, resp, routeData) =>
{
var streamReader = new StreamReader(req.Body);
var data = await streamReader.ReadToEndAsync();
await resp.WriteAsync($"{routeData.Values["name"]} {data}");
}),
new HttpRequestMessage(HttpMethod.Post, "greeting/James") { Content = new StringContent("Biography") },
"James Biography"
},
{
(rb) => rb.MapPut(
"greeting/{name}",
async (req, resp, routeData) =>
{
var streamReader = new StreamReader(req.Body);
var data = await streamReader.ReadToEndAsync();
await resp.WriteAsync($"{routeData.Values["name"]} {data}");
}),
new HttpRequestMessage(HttpMethod.Put, "greeting/James") { Content = new StringContent("Biography") },
"James Biography"
},
{
(rb) => rb.MapDelete("greeting/{name}", (req, resp, routeData) => resp.WriteAsync($"Hello! {routeData.Values["name"]}")),
new HttpRequestMessage(HttpMethod.Delete, "greeting/James"),
"Hello! James"
},
{
(rb) => rb.MapVerb(
"POST",
"greeting/{name}",
async (req, resp, routeData) =>
{
var streamReader = new StreamReader(req.Body);
var data = await streamReader.ReadToEndAsync();
await resp.WriteAsync($"{routeData.Values["name"]} {data}");
}),
new HttpRequestMessage(HttpMethod.Post, "greeting/James") { Content = new StringContent("Biography") },
"James Biography"
},
};
}
}
[Theory]
[MemberData(nameof(MatchesRequest))]
public async Task UseRouter_MapGet_MatchesRequest(Action<IRouteBuilder> routeBuilder, HttpRequestMessage request, string expected)
{
// Arrange
var webhostbuilder = new WebHostBuilder();
webhostbuilder
.ConfigureServices(services => services.AddRouting())
.Configure(app =>
{
app.UseRouter(routeBuilder);
});
var testServer = new TestServer(webhostbuilder);
var client = testServer.CreateClient();
// Act
var response = await client.SendAsync(request);
// Assert
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
var actual = await response.Content.ReadAsStringAsync();
Assert.Equal(expected, actual);
}
}
}

View File

@ -25,19 +25,19 @@ namespace Microsoft.AspNetCore.Routing
return new TheoryData<Action<IRouteBuilder>, Action<HttpContext>>()
{
{ b => { b.MapRoute("api/{id}", NullHandler); }, null },
{ b => { b.MapRoute("api/{id}", app => { }); }, null },
{ b => { b.MapMiddlewareRoute("api/{id}", app => { }); }, null },
{ b => { b.MapDelete("api/{id}", NullHandler); }, c => { c.Request.Method = "DELETE"; } },
{ b => { b.MapDelete("api/{id}", app => { }); }, c => { c.Request.Method = "DELETE"; } },
{ b => { b.MapMiddlewareDelete("api/{id}", app => { }); }, c => { c.Request.Method = "DELETE"; } },
{ b => { b.MapGet("api/{id}", NullHandler); }, c => { c.Request.Method = "GET"; } },
{ b => { b.MapGet("api/{id}", app => { }); }, c => { c.Request.Method = "GET"; } },
{ b => { b.MapMiddlewareGet("api/{id}", app => { }); }, c => { c.Request.Method = "GET"; } },
{ b => { b.MapPost("api/{id}", NullHandler); }, c => { c.Request.Method = "POST"; } },
{ b => { b.MapPost("api/{id}", app => { }); }, c => { c.Request.Method = "POST"; } },
{ b => { b.MapMiddlewarePost("api/{id}", app => { }); }, c => { c.Request.Method = "POST"; } },
{ b => { b.MapPut("api/{id}", NullHandler); }, c => { c.Request.Method = "PUT"; } },
{ b => { b.MapPut("api/{id}", app => { }); }, c => { c.Request.Method = "PUT"; } },
{ b => { b.MapMiddlewarePut("api/{id}", app => { }); }, c => { c.Request.Method = "PUT"; } },
{ b => { b.MapVerb("PUT", "api/{id}", NullHandler); }, c => { c.Request.Method = "PUT"; } },
{ b => { b.MapVerb("PUT", "api/{id}", app => { }); }, c => { c.Request.Method = "PUT"; } },
{ b => { b.MapMiddlewareVerb("PUT", "api/{id}", app => { }); }, c => { c.Request.Method = "PUT"; } },
};
}
}
@ -73,29 +73,29 @@ namespace Microsoft.AspNetCore.Routing
return new TheoryData<Action<IRouteBuilder>, Action<HttpContext>>()
{
{ b => { b.MapRoute("api/{id}/extra", NullHandler); }, null },
{ b => { b.MapRoute("api/{id}/extra", app => { }); }, null },
{ b => { b.MapMiddlewareRoute("api/{id}/extra", app => { }); }, null },
{ b => { b.MapDelete("api/{id}", NullHandler); }, c => { c.Request.Method = "GET"; } },
{ b => { b.MapDelete("api/{id}", app => { }); }, c => { c.Request.Method = "PUT"; } },
{ b => { b.MapMiddlewareDelete("api/{id}", app => { }); }, c => { c.Request.Method = "PUT"; } },
{ b => { b.MapDelete("api/{id}/extra", NullHandler); }, c => { c.Request.Method = "DELETE"; } },
{ b => { b.MapDelete("api/{id}/extra", app => { }); }, c => { c.Request.Method = "DELETE"; } },
{ b => { b.MapMiddlewareDelete("api/{id}/extra", app => { }); }, c => { c.Request.Method = "DELETE"; } },
{ b => { b.MapGet("api/{id}", NullHandler); }, c => { c.Request.Method = "PUT"; } },
{ b => { b.MapGet("api/{id}", app => { }); }, c => { c.Request.Method = "POST"; } },
{ b => { b.MapMiddlewareGet("api/{id}", app => { }); }, c => { c.Request.Method = "POST"; } },
{ b => { b.MapGet("api/{id}/extra", NullHandler); }, c => { c.Request.Method = "GET"; } },
{ b => { b.MapGet("api/{id}/extra", app => { }); }, c => { c.Request.Method = "GET"; } },
{ b => { b.MapMiddlewareGet("api/{id}/extra", app => { }); }, c => { c.Request.Method = "GET"; } },
{ b => { b.MapPost("api/{id}", NullHandler); }, c => { c.Request.Method = "MEH"; } },
{ b => { b.MapPost("api/{id}", app => { }); }, c => { c.Request.Method = "DELETE"; } },
{ b => { b.MapMiddlewarePost("api/{id}", app => { }); }, c => { c.Request.Method = "DELETE"; } },
{ b => { b.MapPost("api/{id}/extra", NullHandler); }, c => { c.Request.Method = "POST"; } },
{ b => { b.MapPost("api/{id}/extra", app => { }); }, c => { c.Request.Method = "POST"; } },
{ b => { b.MapMiddlewarePost("api/{id}/extra", app => { }); }, c => { c.Request.Method = "POST"; } },
{ b => { b.MapPut("api/{id}", NullHandler); }, c => { c.Request.Method = "BLEH"; } },
{ b => { b.MapPut("api/{id}", app => { }); }, c => { c.Request.Method = "HEAD"; } },
{ b => { b.MapMiddlewarePut("api/{id}", app => { }); }, c => { c.Request.Method = "HEAD"; } },
{ b => { b.MapPut("api/{id}/extra", NullHandler); }, c => { c.Request.Method = "PUT"; } },
{ b => { b.MapPut("api/{id}/extra", app => { }); }, c => { c.Request.Method = "PUT"; } },
{ b => { b.MapMiddlewarePut("api/{id}/extra", app => { }); }, c => { c.Request.Method = "PUT"; } },
{ b => { b.MapVerb("PUT", "api/{id}", NullHandler); }, c => { c.Request.Method = "POST"; } },
{ b => { b.MapVerb("PUT", "api/{id}", app => { }); }, c => { c.Request.Method = "HEAD"; } },
{ b => { b.MapMiddlewareVerb("PUT", "api/{id}", app => { }); }, c => { c.Request.Method = "HEAD"; } },
{ b => { b.MapVerb("PUT", "api/{id}/extra", NullHandler); }, c => { c.Request.Method = "PUT"; } },
{ b => { b.MapVerb("PUT", "api/{id}/extra", app => { }); }, c => { c.Request.Method = "PUT"; } },
{ b => { b.MapMiddlewareVerb("PUT", "api/{id}/extra", app => { }); }, c => { c.Request.Method = "PUT"; } },
};
}
}