internal bool TrySearchHttpListener(Uri uri, out HttpListener listener) { listener = null; if (uri == null) { return(false); } var host = uri.Host; var dns = Uri.CheckHostName(host) == UriHostNameType.Dns; var port = uri.Port.ToString(); var path = HttpUtility.UrlDecode(uri.AbsolutePath); var pathSlash = path[path.Length - 1] != '/' ? path + "/" : path; if (host != null && host.Length > 0) { var bestLen = -1; foreach (var pref in _prefixes.Keys) { if (dns) { var prefHost = pref.Host; if (Uri.CheckHostName(prefHost) == UriHostNameType.Dns && prefHost != host) { continue; } } if (pref.Port != port) { continue; } var prefPath = pref.Path; var len = prefPath.Length; if (len < bestLen) { continue; } if (path.StartsWith(prefPath) || pathSlash.StartsWith(prefPath)) { bestLen = len; listener = _prefixes[pref]; } } if (bestLen != -1) { return(true); } } var prefs = _unhandled; listener = searchHttpListenerFromSpecial(path, prefs); if (listener == null && pathSlash != path) { listener = searchHttpListenerFromSpecial(pathSlash, prefs); } if (listener != null) { return(true); } prefs = _all; listener = searchHttpListenerFromSpecial(path, prefs); if (listener == null && pathSlash != path) { listener = searchHttpListenerFromSpecial(pathSlash, prefs); } return(listener != null); }
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 = HttpUtility.UrlDecode(uri.AbsolutePath); var pathSlash = path [path.Length - 1] == '/' ? path : path + "/"; HttpListener bestMatch = null; var bestLength = -1; if (host != null && host.Length > 0) { foreach (var p in _prefixes.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)) { bestLength = ppath.Length; bestMatch = _prefixes [p]; prefix = p; } } if (bestLength != -1) { return(bestMatch); } } var list = _unhandled; bestMatch = matchFromList(host, path, list, out prefix); if (path != pathSlash && bestMatch == null) { bestMatch = matchFromList(host, pathSlash, list, out prefix); } if (bestMatch != null) { return(bestMatch); } list = _all; bestMatch = matchFromList(host, path, list, out prefix); if (path != pathSlash && bestMatch == null) { bestMatch = matchFromList(host, pathSlash, list, out prefix); } if (bestMatch != null) { return(bestMatch); } return(null); }