Skip to content

Commit 87ab81b

Browse files
committed
When Http methods property is an empty array, disallow all methods
1 parent dd24afa commit 87ab81b

File tree

3 files changed

+39
-9
lines changed

3 files changed

+39
-9
lines changed

src/WebJobs.Script.WebHost/Controllers/FunctionsController.cs

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -89,13 +89,6 @@ public override async Task<HttpResponseMessage> ExecuteAsync(HttpControllerConte
8989
return new HttpResponseMessage(HttpStatusCode.Unauthorized);
9090
}
9191

92-
// Validate the HttpMethod
93-
// Note that for WebHook requests, WebHook receiver does its own validation
94-
if (httpFunctionMetadata.Methods != null && !httpFunctionMetadata.Methods.Contains(request.Method))
95-
{
96-
return new HttpResponseMessage(HttpStatusCode.MethodNotAllowed);
97-
}
98-
9992
// Not a WebHook request so dispatch directly
10093
response = await _scriptHostManager.HandleRequestAsync(function, request, cancellationToken);
10194
}

src/WebJobs.Script/Binding/Http/HttpRouteFactory.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,11 @@ public IHttpRoute AddRoute(string routeName, string routeTemplate, IEnumerable<H
3030
{
3131
var routeBuilder = CreateRouteBuilder(routeTemplate);
3232
var constraints = routeBuilder.Constraints;
33-
if (methods != null && methods.Count() > 0)
33+
if (methods != null)
3434
{
35+
// if the methods collection is not null, apply the constraint
36+
// if the methods collection is empty, we'll create a constraint
37+
// that disallows ALL methods
3538
constraints.Add("httpMethod", new HttpMethodConstraint(methods.ToArray()));
3639
}
3740
var httpRoute = routes.CreateRoute(routeBuilder.Template, routeBuilder.Defaults, constraints);

test/WebJobs.Script.Tests/HttpRouteFactoryTests.cs

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public static void AddRoute_AmbiguousRoute_FirstRouteIsChosen()
3939
}
4040

4141
[Fact]
42-
public static void AddRoute_AppliesHttpMethodConstraints()
42+
public static void AddRoute_AppliesHttpMethodConstraint()
4343
{
4444
HttpRouteFactory routeFactory = new HttpRouteFactory("api");
4545

@@ -59,5 +59,39 @@ public static void AddRoute_AppliesHttpMethodConstraints()
5959
routeData = routes.GetRouteData(request);
6060
Assert.Same(route2, routeData.Route);
6161
}
62+
63+
[Fact]
64+
public static void AddRoute_MethodsCollectionNull_DoesNotApplyHttpMethodConstraint()
65+
{
66+
HttpRouteFactory routeFactory = new HttpRouteFactory("api");
67+
68+
HttpRouteCollection routes = new HttpRouteCollection();
69+
var route = routeFactory.AddRoute("route1", "products/{category}/{id?}", null, routes);
70+
71+
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://host/api/products/electronics/123");
72+
var routeData = routes.GetRouteData(request);
73+
Assert.Same(route, routeData.Route);
74+
75+
request = new HttpRequestMessage(HttpMethod.Post, "http://host/api/products/electronics/123");
76+
routeData = routes.GetRouteData(request);
77+
Assert.Same(route, routeData.Route);
78+
}
79+
80+
[Fact]
81+
public static void AddRoute_MethodsCollectionEmpty_AppliesHttpMethodConstraint()
82+
{
83+
HttpRouteFactory routeFactory = new HttpRouteFactory("api");
84+
85+
HttpRouteCollection routes = new HttpRouteCollection();
86+
var route = routeFactory.AddRoute("route1", "products/{category}/{id?}", new HttpMethod[0], routes);
87+
88+
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://host/api/products/electronics/123");
89+
var routeData = routes.GetRouteData(request);
90+
Assert.Null(routeData);
91+
92+
request = new HttpRequestMessage(HttpMethod.Post, "http://host/api/products/electronics/123");
93+
routeData = routes.GetRouteData(request);
94+
Assert.Null(routeData);
95+
}
6296
}
6397
}

0 commit comments

Comments
 (0)