in src/WebJobs.Extensions.Http/HttpTriggerAttributeBindingProvider.cs [322:378]
internal static IReadOnlyDictionary<string, object> GetRequestBindingData(HttpRequest request, string body = null, Dictionary<string, Type> bindingDataContract = null)
{
// apply binding data from request body if present
var bindingData = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
if (request.ContentLength != null && request.ContentLength > 0)
{
Utility.ApplyBindingData(body, bindingData);
}
// apply binding data from the query string
var queryParameters = request.GetQueryParameterDictionary();
foreach (var pair in queryParameters)
{
if (string.Compare("code", pair.Key, StringComparison.OrdinalIgnoreCase) == 0)
{
// skip any system parameters that should not be bound to
continue;
}
bindingData[pair.Key] = pair.Value.ToString();
}
// apply binding data from route parameters
object value = null;
if (request.HttpContext.Items.TryGetValue(HttpExtensionConstants.AzureWebJobsHttpRouteDataKey, out value))
{
var routeBindingData = (Dictionary<string, object>)value;
foreach (var pair in routeBindingData)
{
// if we have a static binding contract that maps to this parameter
// derive the type from that contract mapping and perform any
// necessary conversion
value = pair.Value;
Type type = null;
if (bindingDataContract != null &&
bindingDataContract.TryGetValue(pair.Key, out type))
{
value = ConvertValueIfNecessary(value, type);
}
bindingData[pair.Key] = value;
}
}
// add query parameter collection to binding data
if (!bindingData.ContainsKey(HttpQueryKey))
{
bindingData[HttpQueryKey] = queryParameters;
}
// add headers collection to binding data
if (!bindingData.ContainsKey(HttpHeadersKey))
{
bindingData[HttpHeadersKey] = request.Headers.ToDictionary(kvp => kvp.Key, kvp => kvp.Value.ToString(), StringComparer.OrdinalIgnoreCase);
}
return bindingData;
}