Skip to content

Commit b0228ef

Browse files
committed
Adding HttpMethod and Header support
1 parent 469ea57 commit b0228ef

File tree

24 files changed

+166
-40
lines changed

24 files changed

+166
-40
lines changed

sample/HttpTrigger-Batch/function.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
"bindings": [
33
{
44
"type": "httpTrigger",
5-
"direction": "in"
5+
"direction": "in",
6+
"methods": [ "get" ]
67
},
78
{
89
"type": "http",

sample/HttpTrigger-CSharp/function.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
"bindings": [
33
{
44
"type": "httpTrigger",
5-
"direction": "in"
5+
"direction": "in",
6+
"methods": [ "get" ]
67
},
78
{
89
"type": "http",

sample/HttpTrigger/function.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
"bindings": [
33
{
44
"type": "httpTrigger",
5-
"direction": "in"
5+
"direction": "in",
6+
"methods": [ "get" ]
67
},
78
{
89
"type": "http",

sample/HttpTrigger/index.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
module.exports = function (req, context) {
22
context.log('Node.js HTTP trigger function processed a request. Name=' + req.query.name);
33

4+
var headerValue = req.headers['test-header'];
5+
if (headerValue) {
6+
context.log('test-header=' + headerValue);
7+
}
8+
49
if (typeof req.query.name == 'undefined') {
510
context.done(null, "Please pass a name on the query string");
611
}

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public override async Task<HttpResponseMessage> ExecuteAsync(HttpControllerConte
4242

4343
// Authorize the request
4444
SecretManager secretManager = (SecretManager)controllerContext.Configuration.DependencyResolver.GetService(typeof(SecretManager));
45-
HttpBindingMetadata httpFunctionMetadata = (HttpBindingMetadata)function.Metadata.InputBindings.FirstOrDefault(p => p.Type == BindingType.HttpTrigger);
45+
HttpTriggerBindingMetadata httpFunctionMetadata = (HttpTriggerBindingMetadata)function.Metadata.InputBindings.FirstOrDefault(p => p.Type == BindingType.HttpTrigger);
4646
bool isWebHook = !string.IsNullOrEmpty(httpFunctionMetadata.WebHookType);
4747
if (!isWebHook && !AuthorizationLevelAttribute.IsAuthorized(request, httpFunctionMetadata.AuthLevel, secretManager, functionName: function.Name))
4848
{
@@ -63,6 +63,13 @@ public override async Task<HttpResponseMessage> ExecuteAsync(HttpControllerConte
6363
}
6464
else
6565
{
66+
// Validate the HttpMethod
67+
// Note that for WebHook requests, WebHook receiver does its own validation
68+
if (httpFunctionMetadata.Methods != null && !httpFunctionMetadata.Methods.Contains(request.Method))
69+
{
70+
return new HttpResponseMessage(HttpStatusCode.MethodNotAllowed);
71+
}
72+
6673
// Not a WebHook request so dispatch directly
6774
response = await _scriptHostManager.HandleRequestAsync(function, request, cancellationToken);
6875
}

src/WebJobs.Script.WebHost/WebHooks/WebHookReceiverManager.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public async Task<HttpResponseMessage> HandleRequestAsync(FunctionDescriptor fun
4949
{
5050
// First check if there is a registered WebHook Receiver for this request, and if
5151
// so use it
52-
HttpBindingMetadata httpFunctionMetadata = (HttpBindingMetadata)function.Metadata.InputBindings.FirstOrDefault(p => p.Type == BindingType.HttpTrigger);
52+
HttpTriggerBindingMetadata httpFunctionMetadata = (HttpTriggerBindingMetadata)function.Metadata.InputBindings.FirstOrDefault(p => p.Type == BindingType.HttpTrigger);
5353
string webHookReceiver = httpFunctionMetadata.WebHookType;
5454
IWebHookReceiver receiver = null;
5555
if (string.IsNullOrEmpty(webHookReceiver) || !_receiverLookup.TryGetValue(webHookReceiver, out receiver))

src/WebJobs.Script.WebHost/WebScriptHostManager.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ protected override void OnHostStarted()
8383
HttpFunctions = new Dictionary<string, FunctionDescriptor>();
8484
foreach (var function in Instance.Functions)
8585
{
86-
HttpBindingMetadata httpTriggerBinding = (HttpBindingMetadata)function.Metadata.InputBindings.SingleOrDefault(p => p.Type == BindingType.HttpTrigger);
86+
HttpTriggerBindingMetadata httpTriggerBinding = (HttpTriggerBindingMetadata)function.Metadata.InputBindings.SingleOrDefault(p => p.Type == BindingType.HttpTrigger);
8787
if (httpTriggerBinding != null)
8888
{
8989
string route = httpTriggerBinding.Route;

src/WebJobs.Script/Binding/HttpBinding.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,22 @@ public override async Task BindAsync(BindingContext context)
5555
if (jsonObject["status"] != null && jsonObject["body"] != null)
5656
{
5757
HttpStatusCode statusCode = (HttpStatusCode)jsonObject.Value<int>("status");
58-
string body = jsonObject.Value<string>("body");
58+
string body = jsonObject["body"].ToString();
5959

6060
response = new HttpResponseMessage(statusCode);
6161
response.Content = new StringContent(body);
62+
63+
JObject headers = (JObject)jsonObject["headers"];
64+
if (headers != null)
65+
{
66+
foreach (var header in headers)
67+
{
68+
if (header.Value != null)
69+
{
70+
response.Headers.Add(header.Key, header.Value.ToString());
71+
}
72+
}
73+
}
6274
}
6375
}
6476
catch (JsonException)

src/WebJobs.Script/Description/CSharp/CSharpFunctionDescriptionProvider.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ private ParameterDescriptor CreateTriggerParameterDescriptor(ParameterInfo param
174174
{
175175
triggerMetadata.Name = "req";
176176
}
177-
triggerParameter = ParseHttpTrigger((HttpBindingMetadata)triggerMetadata, methodAttributes, parameter.ParameterType);
177+
triggerParameter = ParseHttpTrigger((HttpTriggerBindingMetadata)triggerMetadata, methodAttributes, parameter.ParameterType);
178178
break;
179179
case BindingType.ManualTrigger:
180180
triggerParameter = ParseManualTrigger(triggerMetadata, methodAttributes, parameter.ParameterType);

src/WebJobs.Script/Description/FunctionDescriptorProvider.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ protected virtual Collection<ParameterDescriptor> GetFunctionParameters(IFunctio
113113
{
114114
triggerMetadata.Name = triggerParameterName = "req";
115115
}
116-
triggerParameter = ParseHttpTrigger((HttpBindingMetadata)triggerMetadata, methodAttributes, typeof(HttpRequestMessage));
116+
triggerParameter = ParseHttpTrigger((HttpTriggerBindingMetadata)triggerMetadata, methodAttributes, typeof(HttpRequestMessage));
117117
break;
118118
case BindingType.ManualTrigger:
119119
triggerParameter = ParseManualTrigger(triggerMetadata, methodAttributes);
@@ -285,7 +285,7 @@ protected ParameterDescriptor ParseTimerTrigger(TimerBindingMetadata trigger, Ty
285285
return new ParameterDescriptor(parameterName, triggerParameterType, attributes);
286286
}
287287

288-
protected ParameterDescriptor ParseHttpTrigger(HttpBindingMetadata trigger, Collection<CustomAttributeBuilder> methodAttributes, Type triggerParameterType = null)
288+
protected ParameterDescriptor ParseHttpTrigger(HttpTriggerBindingMetadata trigger, Collection<CustomAttributeBuilder> methodAttributes, Type triggerParameterType = null)
289289
{
290290
if (trigger == null)
291291
{

0 commit comments

Comments
 (0)