private Group SearchMatchGroup(string key, MatchChainNode matches) { MatchChainNode node = matches; while (node != null) { int num = node.Regex.GroupNumberFromName(key); if (num >= 0) { Group group = node.Match.Groups[num]; if (group.Success) { return(group); } } node = node.Previous; } return(null); }
private RouteResult DoSubRoute(UrlScheme urlScheme, MatchChainNode previousMatch) { RouteResult result = null; int startIndex = 0; if (previousMatch != null) { startIndex = previousMatch.Match.Index + previousMatch.Match.Length; } if (Childs != null) { if (m_BasePathPatternRegex != null) { Match match = m_BasePathPatternRegex.Match(urlScheme.Main, startIndex); if (match.Success && match.Index + match.Length < urlScheme.Main.Length) { MatchChainNode matchWrap = new MatchChainNode(previousMatch, m_BasePathPatternRegex, match); foreach (RouteTable child in Childs) { result = child.DoSubRoute(urlScheme, matchWrap); if (result != null) { break; } } } } else { foreach (RouteTable child in Childs) { result = child.Route(urlScheme); if (result.Succeed) { break; } } } } else if (m_FriendlyPathPatternRegex != null) { Match match = m_FriendlyPathPatternRegex.Match(urlScheme.Main, startIndex); if (match.Success) { MatchChainNode matchWrap = new MatchChainNode(previousMatch, m_FriendlyPathPatternRegex, match); string originalPath = CreateOriginalPath(urlScheme.Main, urlScheme.QueryString, matchWrap); result = new RouteResult(originalPath); } } else { string resultString = OriginalPathBuilder(urlScheme); if (string.IsNullOrEmpty(resultString)) { return(new RouteResult()); } else { return(new RouteResult(resultString)); } } return(result); }
private string CreateOriginalPath(string path, string query, MatchChainNode matches) { StringBuilder sb = new StringBuilder(); int lastIndex = 0; while (lastIndex < OriginalPathPattern.Length) { int startIndex = OriginalPathPattern.IndexOf("${", lastIndex); if (startIndex >= lastIndex) { if (startIndex > 0) { if (OriginalPathPattern[startIndex - 1] == '$') { sb.Append(OriginalPathPattern, startIndex, 2); lastIndex = startIndex + 2; continue; } } if (startIndex > lastIndex) { sb.Append(OriginalPathPattern, lastIndex, startIndex - lastIndex); } int endIndex = OriginalPathPattern.IndexOf("}", startIndex); if (endIndex > lastIndex) { if (endIndex > startIndex + 3) { int keyStartIndex = startIndex + 2; string key = OriginalPathPattern.Substring(keyStartIndex, endIndex - keyStartIndex); Group group = SearchMatchGroup(key, matches); if (group == null) { sb.Append(OriginalPathPattern, startIndex, endIndex - startIndex); } else { sb.Append(path, group.Index, group.Length); } } else { sb.Append(OriginalPathPattern, startIndex, endIndex - startIndex); } lastIndex = endIndex + 1; } else { sb.Append(OriginalPathPattern, startIndex, OriginalPathPattern.Length - startIndex); break; } } else { sb.Append(OriginalPathPattern, lastIndex, OriginalPathPattern.Length - lastIndex); break; } } string originalPath = sb.ToString(); int indexOfQueryString = originalPath.IndexOf('?'); if (indexOfQueryString >= 0) { string head = originalPath.Substring(0, indexOfQueryString); if (indexOfQueryString < originalPath.Length - 1) { string oldQuery = originalPath.Substring(indexOfQueryString); string newQuery = MergeQueryString(oldQuery, query); return(head + "?" + newQuery); } else { return(head + query); } } else { return(originalPath + query); } }
public MatchChainNode(MatchChainNode previous, Regex regex, Match match) { Previous = previous; Regex = regex; Match = match; }
private Group SearchMatchGroup(string key, MatchChainNode matches) { MatchChainNode node = matches; while (node != null) { int num = node.Regex.GroupNumberFromName(key); if (num >= 0) { Group group = node.Match.Groups[num]; if (group.Success) return group; } node = node.Previous; } return null; }
private string CreateOriginalPath(string path, string query, MatchChainNode matches) { StringBuilder sb = new StringBuilder(); int lastIndex = 0; while (lastIndex < OriginalPathPattern.Length) { int startIndex = OriginalPathPattern.IndexOf("${", lastIndex); if (startIndex >= lastIndex) { if (startIndex > 0) { if (OriginalPathPattern[startIndex - 1] == '$') { sb.Append(OriginalPathPattern, startIndex, 2); lastIndex = startIndex + 2; continue; } } if (startIndex > lastIndex) { sb.Append(OriginalPathPattern, lastIndex, startIndex - lastIndex); } int endIndex = OriginalPathPattern.IndexOf("}", startIndex); if (endIndex > lastIndex) { if (endIndex > startIndex + 3) { int keyStartIndex = startIndex + 2; string key = OriginalPathPattern.Substring(keyStartIndex, endIndex - keyStartIndex); Group group = SearchMatchGroup(key, matches); if (group == null) { sb.Append(OriginalPathPattern, startIndex, endIndex - startIndex); } else { sb.Append(path, group.Index, group.Length); } } else { sb.Append(OriginalPathPattern, startIndex, endIndex - startIndex); } lastIndex = endIndex + 1; } else { sb.Append(OriginalPathPattern, startIndex, OriginalPathPattern.Length - startIndex); break; } } else { sb.Append(OriginalPathPattern, lastIndex, OriginalPathPattern.Length - lastIndex); break; } } string originalPath = sb.ToString(); int indexOfQueryString = originalPath.IndexOf('?'); if (indexOfQueryString >= 0) { string head = originalPath.Substring(0, indexOfQueryString); if (indexOfQueryString < originalPath.Length - 1) { string oldQuery = originalPath.Substring(indexOfQueryString); string newQuery = MergeQueryString(oldQuery, query); return head + "?" + newQuery; } else { return head + query; } } else { return originalPath + query; } }
private RouteResult DoSubRoute(UrlScheme urlScheme, MatchChainNode previousMatch) { RouteResult result = null; int startIndex = 0; if (previousMatch != null) startIndex = previousMatch.Match.Index + previousMatch.Match.Length; if (Childs != null) { if (m_BasePathPatternRegex != null) { Match match = m_BasePathPatternRegex.Match(urlScheme.Main, startIndex); if (match.Success && match.Index + match.Length < urlScheme.Main.Length) { MatchChainNode matchWrap = new MatchChainNode(previousMatch, m_BasePathPatternRegex, match); foreach (RouteTable child in Childs) { result = child.DoSubRoute(urlScheme, matchWrap); if (result != null) break; } } } else { foreach (RouteTable child in Childs) { result = child.Route(urlScheme); if (result.Succeed) break; } } } else if (m_FriendlyPathPatternRegex != null) { Match match = m_FriendlyPathPatternRegex.Match(urlScheme.Main, startIndex); if (match.Success) { MatchChainNode matchWrap = new MatchChainNode(previousMatch, m_FriendlyPathPatternRegex, match); string originalPath = CreateOriginalPath(urlScheme.Main, urlScheme.QueryString, matchWrap); result = new RouteResult(originalPath); } } else { string resultString = OriginalPathBuilder(urlScheme); if (string.IsNullOrEmpty(resultString)) return new RouteResult(); else return new RouteResult(resultString); } return result; }