//TODO: handlers shouldn't really be objects //TODO: tons of shared code between these methods public void AddRoute(string method, string path, IHandler handler) { var pathList = path.Split('/').Where(s => !String.IsNullOrEmpty(s)).Select(s => s.ToLowerInvariant()); method = method.ToUpperInvariant(); if (!_routeTrees.ContainsKey(method)) { //add root route for method _routeTrees[method] = new RoutingNode(method); } var root = _routeTrees[method]; root.AddNodeForPath(pathList.ToArray(), 0, path, handler); }
internal void AddNodeForPath(string[] pathParts, int index, string path, IHandler handler) { if (pathParts.Length == index) { if(Handler == null) { Handler = handler; SetTokenPositionsAndNames(pathParts); } else { throw new DuplicateRouteRegistrationException(path); } } else { var nextPart = pathParts[index]; if (nextPart.StartsWith("{") && nextPart.EndsWith("}")) //next part is token { if (null == _tokenNode) { _tokenNode = new RoutingNode(nextPart.Substring(1, nextPart.Length - 2)); } _tokenNode.AddNodeForPath(pathParts, index + 1, path, handler); } else { if (!_namedChildNodes.ContainsKey(nextPart)) { _namedChildNodes[nextPart] = new RoutingNode(nextPart); } _namedChildNodes[nextPart].AddNodeForPath(pathParts, index + 1, path, handler); } } }