in src/Microsoft.Azure.WebJobs.Extensions.OpenApi.Core/Extensions/DocumentHelperExtensions.cs [151:220]
public static List<OpenApiParameter> GetOpenApiParameters(this IDocumentHelper helper, MethodInfo element, HttpTriggerAttribute trigger, NamingStrategy namingStrategy, VisitorCollection collection, OpenApiVersionType version)
{
var parameters = element.GetCustomAttributes<OpenApiParameterAttribute>(inherit: false)
.Where(p => p.Deprecated == false)
.Select(p => p.ToOpenApiParameter(namingStrategy, collection, version))
.ToList();
// This is the interim solution to resolve:
// https://github.com/Azure/azure-functions-openapi-extension/issues/365
//
// It will be removed when the following issue is resolved:
// https://github.com/microsoft/OpenAPI.NET/issues/747
if (version == OpenApiVersionType.V3)
{
return parameters;
}
var attributes = element.GetCustomAttributes<OpenApiRequestBodyAttribute>(inherit: false);
if (!attributes.Any())
{
return parameters;
}
var contents = attributes.Where(p => p.Deprecated == false)
.Where(p => p.ContentType == "application/x-www-form-urlencoded" || p.ContentType == "multipart/form-data")
.Select(p => p.ToOpenApiMediaType(namingStrategy, collection, version));
if (!contents.Any())
{
return parameters;
}
var @ref = contents.First().Schema.Reference;
var schemas = helper.GetOpenApiSchemas(new[] { element }.ToList(), namingStrategy, collection);
var schema = schemas.SingleOrDefault(p => p.Key == @ref.Id);
if (schema.IsNullOrDefault())
{
return parameters;
}
var properties = schema.Value.Properties;
foreach (var property in properties)
{
var value = property.Value;
if ((value.Type == "string" && value.Format == "binary") || (value.Type == "string" && value.Format == "base64"))
{
value.Type = "file";
value.Format = null;
}
var parameter = new OpenApiParameter()
{
Name = property.Key,
Description = $"[formData]{value.Description}",
Required = bool.TryParse($"{value.Required}", out var result) ? result : false,
Deprecated = value.Deprecated,
Schema = value,
};
parameters.Add(parameter);
}
// // TODO: Should this be forcibly provided?
// // This needs to be provided separately.
// if (trigger.AuthLevel != AuthorizationLevel.Anonymous)
// {
// parameters.AddOpenApiParameter<string>("code", @in: ParameterLocation.Query, required: false);
// }
return parameters;
}