in src/Microsoft.Azure.WebJobs.Host/Extensions/JobHostMetadataProvider.cs [161:220]
private static JObject Touchups(Type attributeType, JObject metadata)
{
metadata = (JObject)metadata.DeepClone(); // avoid mutating the inpout
JToken token;
if (attributeType.Name == "BlobAttribute" ||
attributeType.Name == "BlobTriggerAttribute")
{
// Path --> BlobPath
if (metadata.TryGetValue("path", StringComparison.OrdinalIgnoreCase, out token))
{
metadata["BlobPath"] = token;
}
}
if (string.Equals(attributeType.Name, "ServiceBusAttribute", StringComparison.OrdinalIgnoreCase))
{
// queueName --> queueOrTopicName, topicName --> queueOrTopicName
if (metadata.TryGetValue("queueName", StringComparison.OrdinalIgnoreCase, out token))
{
metadata["queueOrTopicName"] = token;
metadata["entityType"] = "Queue";
}
else if (metadata.TryGetValue("topicName", StringComparison.OrdinalIgnoreCase, out token))
{
metadata["queueOrTopicName"] = token;
metadata["entityType"] = "Topic";
}
}
// Other "look like a stream" attributes may expose an Access property for stream direction.
var prop = attributeType.GetProperty("Access", BindingFlags.Instance | BindingFlags.Public);
if (prop != null)
{
if (prop.PropertyType == typeof(FileAccess?))
{
if (metadata.TryGetValue("direction", StringComparison.OrdinalIgnoreCase, out token))
{
FileAccess access;
switch (token.ToString().ToLowerInvariant())
{
case "in":
access = FileAccess.Read;
break;
case "out":
access = FileAccess.Write;
break;
case "inout":
access = FileAccess.ReadWrite;
break;
default:
throw new InvalidOperationException($"Illegal direction value: '{token}'");
}
metadata["access"] = access.ToString();
}
}
}
return metadata;
}