private HttpListener SearchListener(Uri uri, out ListenerPrefix prefix) { prefix = null; if (uri == null) { return(null); } var host = uri.Host; var port = uri.Port; var path = WebUtility.UrlDecode(uri.AbsolutePath); var pathSlash = path[path.Length - 1] == '/' ? path : path + "/"; HttpListener bestMatch = null; var bestLength = -1; if (!string.IsNullOrEmpty(host)) { var result = _prefixes; foreach (var p in result.Keys) { var ppath = p.Path; if (ppath.Length < bestLength) { continue; } if (p.Host != host || p.Port != port) { continue; } if (!path.StartsWith(ppath) && !pathSlash.StartsWith(ppath)) { continue; } bestLength = ppath.Length; bestMatch = result[p]; prefix = p; } if (bestLength != -1) { return(bestMatch); } } var list = _unhandled; bestMatch = MatchFromList(path, list, out prefix); if (path != pathSlash && bestMatch == null) { bestMatch = MatchFromList(pathSlash, list, out prefix); } if (bestMatch != null) { return(bestMatch); } list = _all; bestMatch = MatchFromList(path, list, out prefix); if (path != pathSlash && bestMatch == null) { bestMatch = MatchFromList(pathSlash, list, out prefix); } return(bestMatch); }
private static HttpListener MatchFromList(string path, List <ListenerPrefix> list, out ListenerPrefix prefix) { prefix = null; if (list == null) { return(null); } HttpListener bestMatch = null; var bestLength = -1; foreach (var p in list) { var ppath = p.Path; if (ppath.Length < bestLength) { continue; } if (path.StartsWith(ppath)) { bestLength = ppath.Length; bestMatch = p.Listener; prefix = p; } } return(bestMatch); }