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);
        }
Esempio n. 2
0
        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);
        }