| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 | using System;using System.Net;namespace SocketHttpListener.Net{    internal sealed class ListenerPrefix    {        private string _original;        private string _host;        private ushort _port;        private string _path;        private bool _secure;        private IPAddress[] _addresses;        internal HttpListener _listener;        public ListenerPrefix(string prefix)        {            _original = prefix;            Parse(prefix);        }        public override string ToString()        {            return _original;        }        public IPAddress[] Addresses        {            get => _addresses;            set => _addresses = value;        }        public bool Secure => _secure;        public string Host => _host;        public int Port => _port;        public string Path => _path;        // Equals and GetHashCode are required to detect duplicates in HttpListenerPrefixCollection.        public override bool Equals(object o)        {            var other = o as ListenerPrefix;            if (other == null)                return false;            return (_original == other._original);        }        public override int GetHashCode()        {            return _original.GetHashCode();        }        private 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("net_listener_host");            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)int.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);        }    }}
 |