Exemple #1
0
        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;
        }