| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 | using System;using System.Net;using MediaBrowser.Model.Net;namespace SocketHttpListener.Net{    sealed class ListenerPrefix    {        string original;        string host;        ushort port;        string path;        bool secure;        IPAddress[] addresses;        public HttpListener Listener;        public ListenerPrefix(string prefix)        {            this.original = prefix;            Parse(prefix);        }        public override string ToString()        {            return original;        }        public IPAddress[] Addresses        {            get { return addresses; }            set { addresses = value; }        }        public bool Secure        {            get { return secure; }        }        public string Host        {            get { return host; }        }        public int Port        {            get { return (int)port; }        }        public string Path        {            get { return path; }        }        // Equals and GetHashCode are required to detect duplicates in HttpListenerPrefixCollection.        public override bool Equals(object o)        {            ListenerPrefix other = o as ListenerPrefix;            if (other == null)                return false;            return (original == other.original);        }        public override int GetHashCode()        {            return original.GetHashCode();        }        void Parse(string uri)        {            ushort default_port = 80;            if (uri.StartsWith("https://"))            {                default_port = 443;                secure = true;            }            int length = uri.Length;            int start_host = uri.IndexOf(':') + 3;            if (start_host >= length)                throw new ArgumentException("No host specified.");            int colon = uri.IndexOf(':', start_host, length - start_host);            int root;            if (colon > 0)            {                host = uri.Substring(start_host, colon - start_host);                root = uri.IndexOf('/', colon, length - colon);                port = (ushort)Int32.Parse(uri.Substring(colon + 1, root - colon - 1));                path = uri.Substring(root);            }            else            {                root = uri.IndexOf('/', start_host, length - start_host);                host = uri.Substring(start_host, root - start_host);                port = default_port;                path = uri.Substring(root);            }            if (path.Length != 1)                path = path.Substring(0, path.Length - 1);        }        public static void CheckUri(string uri)        {            if (uri == null)                throw new ArgumentNullException("uriPrefix");            if (!uri.StartsWith("http://") && !uri.StartsWith("https://"))                throw new ArgumentException("Only 'http' and 'https' schemes are supported.");            int length = uri.Length;            int start_host = uri.IndexOf(':') + 3;            if (start_host >= length)                throw new ArgumentException("No host specified.");            int colon = uri.IndexOf(':', start_host, length - start_host);            if (start_host == colon)                throw new ArgumentException("No host specified.");            int root;            if (colon > 0)            {                root = uri.IndexOf('/', colon, length - colon);                if (root == -1)                    throw new ArgumentException("No path specified.");                try                {                    int p = Int32.Parse(uri.Substring(colon + 1, root - colon - 1));                    if (p <= 0 || p >= 65536)                        throw new Exception();                }                catch                {                    throw new ArgumentException("Invalid port.");                }            }            else            {                root = uri.IndexOf('/', start_host, length - start_host);                if (root == -1)                    throw new ArgumentException("No path specified.");            }            if (uri[uri.Length - 1] != '/')                throw new ArgumentException("The prefix must end with '/'");        }    }}
 |