private void ProcessTreeRoute(TreeRouteData treeRouteData) { if (_MessageHandler != null) { treeRouteData.MessageHandlers.Add(_MessageHandler); } foreach (var value in Defaults) { treeRouteData.Values[value.Key] = value.Value; } // Parse Parameters from URL and add them to the treeRouteData if (UseRegex) { var result = _MatchPattern.Match(treeRouteData.CurrentSegment); for (int i = 1; i < result.Groups.Count; i++) { var name = _MatchPattern.GroupNameFromNumber(i); var value = result.Groups[i].Value; treeRouteData.SetParameter(name, value); } } treeRouteData.AddRouter(this); // Track ApiRouters used to resolve path }
private IHttpRouteData Dispatch(TreeRouteData treeRouteData) { if (_HasController) { treeRouteData.Values["controller"] = _ControllerType.Name.Replace("Controller", ""); return(treeRouteData); } else if (treeRouteData.Values.ContainsKey("controller")) { return(treeRouteData); } return(null); }
private IHttpRouteData Find(HttpRequestMessage request, TreeRouteData treeRouteData) { if (treeRouteData == null) { treeRouteData = new TreeRouteData(request.RequestUri, _InitalPosition); if (SegmentTemplate == string.Empty) { if (treeRouteData.AtRoot()) { return(Dispatch(treeRouteData)); //Special case root } } else { if (!Matches(request, treeRouteData.CurrentSegment)) { return(null); // URI segment does not match this TreeRoute } } } ProcessTreeRoute(treeRouteData); if (treeRouteData.EndOfPath()) { return(Dispatch(treeRouteData)); } treeRouteData.MoveToNext(); var nextRouter = _childRouters.FirstOrDefault(childRouter => childRouter.Matches(request, treeRouteData.CurrentSegment)); if (nextRouter != null) { return(nextRouter.Find(request, treeRouteData)); } return(null); }