public void CompareTo_RespectsOrder(int prefixOrder1, int prefixOrder2, int order1, int order2, int expectedValue) { HttpRouteEntry x = new HttpRouteEntry() { PrefixOrder = prefixOrder1, Order = order1 }; HttpRouteEntry y = new HttpRouteEntry() { PrefixOrder = prefixOrder2, Order = order2 }; Assert.Equal(expectedValue, x.CompareTo(y)); }
private static void AddRouteEntries(List <HttpRouteEntry> routes, string actionName, string routePrefix, Collection <IHttpRouteInfoProvider> routeProviders, IEnumerable <ReflectedHttpActionDescriptor> actionDescriptors) { foreach (IHttpRouteInfoProvider routeProvider in routeProviders) { HttpRouteEntry entry = CreateRouteEntry(actionName, routePrefix, routeProvider, actionDescriptors); bool mergedWithExistingEntry = false; if (String.IsNullOrEmpty(entry.Name)) { // Merge unnamed entries with the exact same template and order. HttpRouteEntry existingMatch = routes.SingleOrDefault( e => String.IsNullOrEmpty(e.Name) && String.Equals(e.Template, entry.Template, StringComparison.Ordinal) && e.Order == entry.Order); if (existingMatch != null) { mergedWithExistingEntry = true; foreach (ReflectedHttpActionDescriptor descriptor in actionDescriptors) { existingMatch.Actions.Add(descriptor); } } } if (!mergedWithExistingEntry) { routes.Add(entry); } } }
private static decimal GetPrecedence(string attributeRouteTemplate) { DefaultInlineConstraintResolver resolver = new DefaultInlineConstraintResolver(); HttpRouteValueDictionary defaults = new HttpRouteValueDictionary(); HttpRouteValueDictionary constraints = new HttpRouteValueDictionary(); string standardRouteTemplate = InlineRouteTemplateParser.ParseRouteTemplate(attributeRouteTemplate, defaults, constraints, new DefaultInlineConstraintResolver()); HttpParsedRoute parsedRoute = HttpRouteParser.Parse(standardRouteTemplate); return(HttpRouteEntry.GetPrecedence(parsedRoute, constraints)); }
public void CompareTo_RespectsOrder(int order1, int order2, int expectedValue) { #if ASPNETWEBAPI var x = new HttpRouteEntry(); var y = new HttpRouteEntry(); #else var x = new RouteEntry(); var y = new RouteEntry(); #endif x.Order = order1; y.Order = order2; Assert.Equal(expectedValue, x.CompareTo(y)); }
private static IEnumerable<HttpRouteEntry> CreateRouteEntries(HttpControllerDescriptor controllerDescriptor) { IHttpActionSelector actionSelector = controllerDescriptor.Configuration.Services.GetActionSelector(); ILookup<string, HttpActionDescriptor> actionMap = actionSelector.GetActionMapping(controllerDescriptor); if (actionMap == null) { return Enumerable.Empty<HttpRouteEntry>(); } List<HttpRouteEntry> routes = new List<HttpRouteEntry>(); string routePrefix = GetRoutePrefix(controllerDescriptor); Collection<IHttpRouteInfoProvider> defaultRouteProviders = GetDefaultRouteTemplate(controllerDescriptor); foreach (IGrouping<string, HttpActionDescriptor> actionGrouping in actionMap) { string actionName = actionGrouping.Key; foreach (ReflectedHttpActionDescriptor actionDescriptor in actionGrouping.OfType<ReflectedHttpActionDescriptor>()) { Collection<IHttpRouteInfoProvider> routeProviders = actionDescriptor.GetCustomAttributes<IHttpRouteInfoProvider>(inherit: false); if (routeProviders.Count == 0) { // IF there are no routes on the specific action, then use the one provided via the DefaultRouteAttribute. if (defaultRouteProviders != null) { routeProviders = defaultRouteProviders; } } foreach (IHttpRouteInfoProvider routeProvider in routeProviders) { string providerTemplate = routeProvider.RouteTemplate; if (providerTemplate == null) { continue; } if (providerTemplate.StartsWith("/", StringComparison.Ordinal)) { throw Error.InvalidOperation(SRResources.AttributeRoutes_InvalidTemplate, providerTemplate, actionName); } string routeTemplate = BuildRouteTemplate(routePrefix, providerTemplate); IEnumerable<HttpMethod> verbs = actionDescriptor.SupportedHttpMethods; // Try to find an entry with the same route template and the same HTTP verbs HttpRouteEntry existingEntry = null; foreach (HttpRouteEntry entry in routes) { if (String.Equals(routeTemplate, entry.RouteTemplate, StringComparison.OrdinalIgnoreCase) && AreEqual(verbs, entry.HttpMethods)) { existingEntry = entry; break; } } if (existingEntry == null) { HttpRouteEntry entry = new HttpRouteEntry() { RouteTemplate = routeTemplate, Actions = new HashSet<ReflectedHttpActionDescriptor>() { actionDescriptor } }; entry.HttpMethods = verbs; entry.Name = routeProvider.RouteName; entry.Order = routeProvider.RouteOrder; routes.Add(entry); } else { existingEntry.Actions.Add(actionDescriptor); // Take the minimum of the two orders as the order int order = routeProvider.RouteOrder; if (order < existingEntry.Order) { existingEntry.Order = order; } // Use the provider route name if the route hasn't already been named if (existingEntry.Name == null) { existingEntry.Name = routeProvider.RouteName; } } } } } return routes; }
private static IEnumerable <HttpRouteEntry> CreateRouteEntries(HttpControllerDescriptor controllerDescriptor) { IHttpActionSelector actionSelector = controllerDescriptor.Configuration.Services.GetActionSelector(); ILookup <string, HttpActionDescriptor> actionMap = actionSelector.GetActionMapping(controllerDescriptor); if (actionMap == null) { return(Enumerable.Empty <HttpRouteEntry>()); } List <HttpRouteEntry> routes = new List <HttpRouteEntry>(); string routePrefix = GetRoutePrefix(controllerDescriptor); foreach (IGrouping <string, HttpActionDescriptor> actionGrouping in actionMap) { string actionName = actionGrouping.Key; foreach (ReflectedHttpActionDescriptor actionDescriptor in actionGrouping.OfType <ReflectedHttpActionDescriptor>()) { foreach (IHttpRouteInfoProvider routeProvider in actionDescriptor.GetCustomAttributes <IHttpRouteInfoProvider>(inherit: false)) { string providerTemplate = routeProvider.RouteTemplate; if (providerTemplate == null) { continue; } if (providerTemplate.StartsWith("/", StringComparison.Ordinal)) { throw Error.InvalidOperation(SRResources.AttributeRoutes_InvalidTemplate, providerTemplate, actionName); } string routeTemplate = BuildRouteTemplate(routePrefix, providerTemplate); // Try to find an entry with the same route template and the same HTTP verbs HttpRouteEntry existingEntry = null; foreach (HttpRouteEntry entry in routes) { if (String.Equals(routeTemplate, entry.RouteTemplate, StringComparison.OrdinalIgnoreCase) && AreEqual(routeProvider.HttpMethods, entry.HttpMethods)) { existingEntry = entry; break; } } if (existingEntry == null) { HttpRouteEntry entry = new HttpRouteEntry() { RouteTemplate = routeTemplate, Actions = new HashSet <ReflectedHttpActionDescriptor>() { actionDescriptor } }; entry.HttpMethods = routeProvider.HttpMethods; entry.Name = routeProvider.RouteName; entry.Order = routeProvider.RouteOrder; routes.Add(entry); } else { existingEntry.Actions.Add(actionDescriptor); // Take the minimum of the two orders as the order int order = routeProvider.RouteOrder; if (order < existingEntry.Order) { existingEntry.Order = order; } // Use the provider route name if the route hasn't already been named if (existingEntry.Name == null) { existingEntry.Name = routeProvider.RouteName; } } } } } return(routes); }
public int CompareTo(HttpRouteEntry other)
// Default ordering goes through segments one by one and tries to apply an ordering #if ASPNETWEBAPI private static int Compare(HttpRouteEntry entry1, HttpRouteEntry entry2)
private static List<HttpRouteEntry> CreateAttributeRoutes(HttpRouteBuilder routeBuilder, string controllerName, Collection<RoutePrefixAttribute> routePrefixes, IGrouping<string, HttpActionDescriptor> actionGrouping) { List<HttpRouteEntry> routes = new List<HttpRouteEntry>(); string actionName = actionGrouping.Key; foreach (HttpActionDescriptor actionDescriptor in actionGrouping) { IEnumerable<IHttpRouteInfoProvider> routeInfoProviders = actionDescriptor.GetCustomAttributes<IHttpRouteInfoProvider>(inherit: false); // DefaultIfEmpty below is required to add routes when there is a route prefix but no // route provider or when there is a route provider with a template but no route prefix foreach (RoutePrefixAttribute routePrefix in routePrefixes.DefaultIfEmpty()) { foreach (IHttpRouteInfoProvider routeProvider in routeInfoProviders.DefaultIfEmpty()) { string prefixTemplate = routePrefix == null ? null : routePrefix.Prefix; string providerTemplate = routeProvider == null ? null : routeProvider.RouteTemplate; if (prefixTemplate == null && providerTemplate == null) { continue; } ValidateTemplates(prefixTemplate, providerTemplate, actionDescriptor); string routeTemplate; if (String.IsNullOrEmpty(prefixTemplate)) { routeTemplate = providerTemplate ?? String.Empty; } else if (String.IsNullOrEmpty(providerTemplate)) { routeTemplate = prefixTemplate; } else { // template and prefix both not null - combine them routeTemplate = prefixTemplate + '/' + providerTemplate; } Collection<HttpMethod> httpMethods = actionDescriptor.SupportedHttpMethods; IHttpRoute route = routeBuilder.BuildHttpRoute(routeTemplate, httpMethods, controllerName, actionName); HttpRouteEntry entry = new HttpRouteEntry() { Route = route, RouteTemplate = routeTemplate }; if (routeProvider != null) { entry.Name = routeProvider.RouteName; entry.Order = routeProvider.RouteOrder; } if (routePrefix != null) { entry.PrefixOrder = routePrefix.Order; } routes.Add(entry); } } } SetDefaultRouteNames(routes, controllerName, actionName); return routes; }
private static IEnumerable<HttpRouteEntry> CreateRouteEntries(HttpControllerDescriptor controllerDescriptor) { IHttpActionSelector actionSelector = controllerDescriptor.Configuration.Services.GetActionSelector(); ILookup<string, HttpActionDescriptor> actionMap = actionSelector.GetActionMapping(controllerDescriptor); if (actionMap == null) { return Enumerable.Empty<HttpRouteEntry>(); } List<HttpRouteEntry> routes = new List<HttpRouteEntry>(); RoutePrefixAttribute routePrefix = controllerDescriptor.GetCustomAttributes<RoutePrefixAttribute>(inherit: false).SingleOrDefault(); foreach (IGrouping<string, HttpActionDescriptor> actionGrouping in actionMap) { string actionName = actionGrouping.Key; foreach (ReflectedHttpActionDescriptor actionDescriptor in actionGrouping.OfType<ReflectedHttpActionDescriptor>()) { IEnumerable<IHttpRouteInfoProvider> routeInfoProviders = actionDescriptor.GetCustomAttributes<IHttpRouteInfoProvider>(inherit: false); foreach (IHttpRouteInfoProvider routeProvider in routeInfoProviders.DefaultIfEmpty()) { string routeTemplate = BuildRouteTemplate(routePrefix, routeProvider, controllerDescriptor.ControllerName); if (routeTemplate == null) { continue; } // Try to find an entry with the same route template and the same HTTP verbs HttpRouteEntry existingEntry = null; foreach (HttpRouteEntry entry in routes) { if (String.Equals(routeTemplate, entry.RouteTemplate, StringComparison.OrdinalIgnoreCase) && AreEqual(routeProvider.HttpMethods, entry.HttpMethods)) { existingEntry = entry; break; } } if (existingEntry == null) { HttpRouteEntry entry = new HttpRouteEntry() { RouteTemplate = routeTemplate, Actions = new HashSet<ReflectedHttpActionDescriptor>() { actionDescriptor } }; if (routeProvider != null) { entry.HttpMethods = routeProvider.HttpMethods; entry.Name = routeProvider.RouteName; entry.Order = routeProvider.RouteOrder; } routes.Add(entry); } else { existingEntry.Actions.Add(actionDescriptor); // Take the minimum of the two orders as the order int order = routeProvider == null ? 0 : routeProvider.RouteOrder; if (order < existingEntry.Order) { existingEntry.Order = order; } // Use the provider route name if the route hasn't already been named if (routeProvider != null && existingEntry.Name == null) { existingEntry.Name = routeProvider.RouteName; } } } } } return routes; }
private static List <HttpRouteEntry> CreateAttributeRoutes(HttpRouteBuilder routeBuilder, string controllerName, Collection <RoutePrefixAttribute> routePrefixes, IGrouping <string, HttpActionDescriptor> actionGrouping) { List <HttpRouteEntry> routes = new List <HttpRouteEntry>(); string actionName = actionGrouping.Key; foreach (HttpActionDescriptor actionDescriptor in actionGrouping) { IEnumerable <IHttpRouteInfoProvider> routeInfoProviders = actionDescriptor.GetCustomAttributes <IHttpRouteInfoProvider>(inherit: false); // DefaultIfEmpty below is required to add routes when there is a route prefix but no // route provider or when there is a route provider with a template but no route prefix foreach (RoutePrefixAttribute routePrefix in routePrefixes.DefaultIfEmpty()) { foreach (IHttpRouteInfoProvider routeProvider in routeInfoProviders.DefaultIfEmpty()) { string prefixTemplate = routePrefix == null ? null : routePrefix.Prefix; string providerTemplate = routeProvider == null ? null : routeProvider.RouteTemplate; if (prefixTemplate == null && providerTemplate == null) { continue; } ValidateTemplates(prefixTemplate, providerTemplate, actionDescriptor); string routeTemplate; if (String.IsNullOrEmpty(prefixTemplate)) { routeTemplate = providerTemplate ?? String.Empty; } else if (String.IsNullOrEmpty(providerTemplate)) { routeTemplate = prefixTemplate; } else { // template and prefix both not null - combine them routeTemplate = prefixTemplate + '/' + providerTemplate; } Collection <HttpMethod> httpMethods = actionDescriptor.SupportedHttpMethods; IHttpRoute route = routeBuilder.BuildHttpRoute(routeTemplate, httpMethods, controllerName, actionName); HttpRouteEntry entry = new HttpRouteEntry() { Route = route, RouteTemplate = routeTemplate }; if (routeProvider != null) { entry.Name = routeProvider.RouteName; entry.Order = routeProvider.RouteOrder; } if (routePrefix != null) { entry.PrefixOrder = routePrefix.Order; } routes.Add(entry); } } } SetDefaultRouteNames(routes, controllerName, actionName); return(routes); }