private static bool TryExpandUriParameters(IHttpRoute route, string routeTemplate, ICollection <ApiParameterDescription> parameterDescriptions, out string expandedRouteTemplate) { HttpParsedRoute parsedRoute = HttpRouteParser.Parse(routeTemplate); Dictionary <string, object> parameterValuesForRoute = new Dictionary <string, object>(); foreach (ApiParameterDescription parameterDescriptor in parameterDescriptions) { Type parameterType = parameterDescriptor.ParameterDescriptor.ParameterType; if (parameterDescriptor.Source == ApiParameterSource.FromUri && TypeHelper.IsSimpleUnderlyingType(parameterType)) { parameterValuesForRoute.Add(parameterDescriptor.Name, "{" + parameterDescriptor.Name + "}"); } } BoundRouteTemplate boundRouteTemplate = parsedRoute.Bind(null, parameterValuesForRoute, new HttpRouteValueDictionary(route.Defaults), new HttpRouteValueDictionary(route.Constraints)); if (boundRouteTemplate == null) { expandedRouteTemplate = null; return(false); } expandedRouteTemplate = Uri.UnescapeDataString(boundRouteTemplate.BoundTemplate); return(true); }
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 static decimal Compute(string template) { DefaultInlineConstraintResolver resolver = new DefaultInlineConstraintResolver(); HttpRouteValueDictionary defaults = new HttpRouteValueDictionary(); HttpRouteValueDictionary constraints = new HttpRouteValueDictionary(); string standardRouteTemplate = InlineRouteTemplateParser.ParseRouteTemplate(template, defaults, constraints, new DefaultInlineConstraintResolver()); HttpParsedRoute parsedRoute = HttpRouteParser.Parse(standardRouteTemplate); return(RoutePrecedence.Compute(parsedRoute, constraints)); }