private void PopulateActionDescriptions(HttpActionDescriptor actionDescriptor, IHttpRoute route, string localPath, Collection <ApiDescription> apiDescriptions) { string apiDocumentation = GetApiDocumentation(actionDescriptor); HttpParsedRoute parsedRoute = HttpRouteParser.Parse(localPath); // parameters IList <ApiParameterDescription> parameterDescriptions = CreateParameterDescriptions(actionDescriptor, parsedRoute, route.Defaults); // expand all parameter variables string finalPath; if (!TryExpandUriParameters(route, parsedRoute, parameterDescriptions, out finalPath)) { // the action cannot be reached due to parameter mismatch, e.g. routeTemplate = "/users/{name}" and GetUsers(id) return; } // request formatters ApiParameterDescription bodyParameter = parameterDescriptions.FirstOrDefault(description => description.Source == ApiParameterSource.FromBody); IEnumerable <MediaTypeFormatter> supportedRequestBodyFormatters = bodyParameter != null? actionDescriptor.Configuration.Formatters.Where(f => f.CanReadType(bodyParameter.ParameterDescriptor.ParameterType)) : Enumerable.Empty <MediaTypeFormatter>(); // response formatters ResponseDescription responseDescription = CreateResponseDescription(actionDescriptor); Type returnType = responseDescription.ResponseType ?? responseDescription.DeclaredType; IEnumerable <MediaTypeFormatter> supportedResponseFormatters = returnType != null? actionDescriptor.Configuration.Formatters.Where(f => f.CanWriteType(returnType)) : Enumerable.Empty <MediaTypeFormatter>(); // Replacing the formatter tracers with formatters if tracers are present. supportedRequestBodyFormatters = GetInnerFormatters(supportedRequestBodyFormatters); supportedResponseFormatters = GetInnerFormatters(supportedResponseFormatters); // get HttpMethods supported by an action. Usually there is one HttpMethod per action but we allow multiple of them per action as well. IList <HttpMethod> supportedMethods = GetHttpMethodsSupportedByAction(route, actionDescriptor); foreach (HttpMethod method in supportedMethods) { apiDescriptions.Add(new ApiDescription { Documentation = apiDocumentation, HttpMethod = method, RelativePath = finalPath, ActionDescriptor = actionDescriptor, Route = route, SupportedResponseFormatters = new Collection <MediaTypeFormatter>(supportedResponseFormatters.ToList()), SupportedRequestBodyFormatters = new Collection <MediaTypeFormatter>(supportedRequestBodyFormatters.ToList()), ParameterDescriptions = new Collection <ApiParameterDescription>(parameterDescriptions), ResponseDescription = responseDescription }); } }
private IEnumerable<Response> GetResponses(ResponseDescription responseDescription) { if (responseDescription.ResponseType == null && responseDescription.DeclaredType == null) return new Collection<Response>(); var responseType = responseDescription.ResponseType ?? responseDescription.DeclaredType; if(responseType == typeof(IHttpActionResult)) return new Collection<Response>(); var schemaName = AddSchema(responseType); var mimeTypes = new Dictionary<string, MimeType> { { "application/json", new MimeType { Schema = schemaName } } }; var response = new Response { Body = mimeTypes, Code = "200" // TODO: is it OK to asume this ? }; return new[] {response}; }
private ResponseDescription CreateResponseDescription(HttpActionDescriptor actionDescriptor) { Type type = ( from attribute in actionDescriptor.GetCustomAttributes<ResponseTypeAttribute>() select attribute.ResponseType).FirstOrDefault<Type>(); ResponseDescription responseDescription = new ResponseDescription() { DeclaredType = actionDescriptor.ReturnType, ResponseType = type, Documentation = this.GetApiResponseDocumentation(actionDescriptor) }; return responseDescription; }
private static void SetPropertyTo(ApiDescription apiDescription, ResponseDescription responseDescription, System.Reflection.PropertyInfo property) { if (property != null) property.SetValue(apiDescription, responseDescription); }
public static void SetResponseDescription(this ApiDescription apiDescription, ResponseDescription responseDescription) { var property = GetPropertyFrom(apiDescription); SetPropertyTo(apiDescription, responseDescription, property); }
private static void SetInternalProperty(ApiDescription mockApiDescription, ResponseDescription responseDescription) { var type = mockApiDescription.GetType(); var responseDescriptionProperty = type.GetProperty("ResponseDescription"); responseDescriptionProperty.SetValue(mockApiDescription, responseDescription); }
private static ApiDescription CreateApiDescription(string relativePath, HttpMethod httpMethod, string codeMethod, Type responseType) { var mockApiControllerType = typeof(MockApiController); var mockApiDescription = new ApiDescription { RelativePath = relativePath, HttpMethod = httpMethod, ActionDescriptor = new ReflectedHttpActionDescriptor { ControllerDescriptor = new HttpControllerDescriptor { Configuration = new HttpConfiguration(), ControllerName = "MockApiController", ControllerType = typeof(MockApiController) }, MethodInfo = mockApiControllerType.GetMethod(codeMethod) } }; var responseDescription = new ResponseDescription { DeclaredType = responseType }; SetInternalProperty(mockApiDescription, responseDescription); return mockApiDescription; }
private IEnumerable<Response> GetResponses(ResponseDescription responseDescription, ApiDescription api) { var responses = new List<Response>(); if (responseDescription.ResponseType == null && responseDescription.DeclaredType == null) return responses; var responseType = responseDescription.ResponseType ?? responseDescription.DeclaredType; var attributes = api.ActionDescriptor.GetCustomAttributes<Attribute>(); responses = HandleResponseTypeStatusAttributes(attributes); if(responseType == typeof(IHttpActionResult)) return responses; responses.Add(HandleResponseTypeAttributes(responseType)); return responses; }