Esempio n. 1
0
        private static void removePrefix(string uriPrefix, WebSocketSharp.Net.HttpListener listener)
        {
            int num;
            EndPointListener   endPointListener;
            HttpListenerPrefix httpListenerPrefix = new HttpListenerPrefix(uriPrefix);
            IPAddress          pAddress           = EndPointManager.convertToIPAddress(httpListenerPrefix.Host);

            if (pAddress.IsLocal())
            {
                if (int.TryParse(httpListenerPrefix.Port, out num))
                {
                    if (num.IsPortNumber())
                    {
                        string path = httpListenerPrefix.Path;
                        if (path.IndexOf('%') == -1)
                        {
                            if (path.IndexOf("//", StringComparison.Ordinal) == -1)
                            {
                                IPEndPoint pEndPoint = new IPEndPoint(pAddress, num);
                                if (EndPointManager._endpoints.TryGetValue(pEndPoint, out endPointListener))
                                {
                                    if (!(endPointListener.IsSecure ^ httpListenerPrefix.IsSecure))
                                    {
                                        endPointListener.RemovePrefix(httpListenerPrefix, listener);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
Esempio n. 2
0
        public static void AddListener(WebSocketSharp.Net.HttpListener listener)
        {
            List <string> strs     = new List <string>();
            object        syncRoot = ((ICollection)EndPointManager._endpoints).SyncRoot;

            Monitor.Enter(syncRoot);
            try
            {
                try
                {
                    foreach (string prefix in listener.Prefixes)
                    {
                        EndPointManager.addPrefix(prefix, listener);
                        strs.Add(prefix);
                    }
                }
                catch
                {
                    foreach (string str in strs)
                    {
                        EndPointManager.removePrefix(str, listener);
                    }
                    throw;
                }
            }
            finally
            {
                Monitor.Exit(syncRoot);
            }
        }
Esempio n. 3
0
        public ResponseStream GetResponseStream()
        {
            ResponseStream responseStream;

            if ((this._outputStream != null ? false : this._socket != null))
            {
                object obj = this._sync;
                Monitor.Enter(obj);
                try
                {
                    if (this._socket != null)
                    {
                        WebSocketSharp.Net.HttpListener listener = this._context.Listener;
                        bool flag = (listener != null ? listener.IgnoreWriteExceptions : true);
                        this._outputStream = new ResponseStream(this._stream, this._context.Response, flag);
                        responseStream     = this._outputStream;
                    }
                    else
                    {
                        responseStream = this._outputStream;
                    }
                }
                finally
                {
                    Monitor.Exit(obj);
                }
            }
            else
            {
                responseStream = this._outputStream;
            }
            return(responseStream);
        }
 private static WebSocketSharp.Net.HttpListener searchHttpListenerFromSpecial(string path, List <HttpListenerPrefix> prefixes)
 {
     WebSocketSharp.Net.HttpListener httpListener;
     if (prefixes != null)
     {
         WebSocketSharp.Net.HttpListener listener = null;
         int num = -1;
         foreach (HttpListenerPrefix prefix in prefixes)
         {
             string str    = prefix.Path;
             int    length = str.Length;
             if (length >= num)
             {
                 if (path.StartsWith(str))
                 {
                     num      = length;
                     listener = prefix.Listener;
                 }
             }
         }
         httpListener = listener;
     }
     else
     {
         httpListener = null;
     }
     return(httpListener);
 }
Esempio n. 5
0
        /*
         * Starts the server.
         */
        public void Start()
        {
            // Throw an exception if the server is running.
            if (this.Running)
            {
                throw new WebException("Server is already running. Stop the server before running.");
            }

            // Set up the HTTP listener.
            this.Running  = true;
            this.Listener = new HttpListener();
            foreach (var prefix in this.Prefixes)
            {
                this.Listener.Prefixes.Add(prefix);
            }
            this.Listener.Start();

            // Run a loop to accept client connections until it is closed.
            while (Running)
            {
                // Start the context fetching async and wait for it to be completed or to be cancelled.
                var task = Task.Run(() => this.Listener.GetContext());
                task.ContinueWith((result) =>
                {
                    this.HandleRequest(result.Result);
                    this.ConnectionAcceptedEvent.Set();
                });

                // Wait for a connection to be accepted or the listener to close.
                this.ConnectionAcceptedEvent.WaitOne();
            }

            // Signal that the loop ended.
            this.ConnectionLoopEndedEvent.Set();
        }
Esempio n. 6
0
        public static void AddPrefix(string uriPrefix, WebSocketSharp.Net.HttpListener listener)
        {
            object syncRoot = ((ICollection)EndPointManager._endpoints).SyncRoot;

            Monitor.Enter(syncRoot);
            try
            {
                EndPointManager.addPrefix(uriPrefix, listener);
            }
            finally
            {
                Monitor.Exit(syncRoot);
            }
        }
        public void AddPrefix(HttpListenerPrefix prefix, WebSocketSharp.Net.HttpListener listener)
        {
            List <HttpListenerPrefix> httpListenerPrefixes;
            List <HttpListenerPrefix> httpListenerPrefixes1;
            Dictionary <HttpListenerPrefix, WebSocketSharp.Net.HttpListener> httpListenerPrefixes2;
            Dictionary <HttpListenerPrefix, WebSocketSharp.Net.HttpListener> httpListenerPrefixes3;

            if (prefix.Host == "*")
            {
                do
                {
                    httpListenerPrefixes  = this._unhandled;
                    httpListenerPrefixes1 = (httpListenerPrefixes != null ? new List <HttpListenerPrefix>(httpListenerPrefixes) : new List <HttpListenerPrefix>());
                    prefix.Listener       = listener;
                    EndPointListener.addSpecial(httpListenerPrefixes1, prefix);
                }while (Interlocked.CompareExchange <List <HttpListenerPrefix> >(ref this._unhandled, httpListenerPrefixes1, httpListenerPrefixes) != httpListenerPrefixes);
            }
            else if (prefix.Host != "+")
            {
                do
                {
                    httpListenerPrefixes2 = this._prefixes;
                    if (!httpListenerPrefixes2.ContainsKey(prefix))
                    {
                        httpListenerPrefixes3         = new Dictionary <HttpListenerPrefix, WebSocketSharp.Net.HttpListener>(httpListenerPrefixes2);
                        httpListenerPrefixes3[prefix] = listener;
                    }
                    else
                    {
                        if (httpListenerPrefixes2[prefix] != listener)
                        {
                            throw new WebSocketSharp.Net.HttpListenerException(87, string.Format("There's another listener for {0}.", prefix));
                        }
                        break;
                    }
                }while (Interlocked.CompareExchange <Dictionary <HttpListenerPrefix, WebSocketSharp.Net.HttpListener> >(ref this._prefixes, httpListenerPrefixes3, httpListenerPrefixes2) != httpListenerPrefixes2);
            }
            else
            {
                do
                {
                    httpListenerPrefixes  = this._all;
                    httpListenerPrefixes1 = (httpListenerPrefixes != null ? new List <HttpListenerPrefix>(httpListenerPrefixes) : new List <HttpListenerPrefix>());
                    prefix.Listener       = listener;
                    EndPointListener.addSpecial(httpListenerPrefixes1, prefix);
                }while (Interlocked.CompareExchange <List <HttpListenerPrefix> >(ref this._all, httpListenerPrefixes1, httpListenerPrefixes) != httpListenerPrefixes);
            }
        }
Esempio n. 8
0
        public static void RemoveListener(WebSocketSharp.Net.HttpListener listener)
        {
            object syncRoot = ((ICollection)EndPointManager._endpoints).SyncRoot;

            Monitor.Enter(syncRoot);
            try
            {
                foreach (string prefix in listener.Prefixes)
                {
                    EndPointManager.removePrefix(prefix, listener);
                }
            }
            finally
            {
                Monitor.Exit(syncRoot);
            }
        }
Esempio n. 9
0
        private static void addPrefix(string uriPrefix, WebSocketSharp.Net.HttpListener listener)
        {
            int num;
            EndPointListener   endPointListener;
            HttpListenerPrefix httpListenerPrefix = new HttpListenerPrefix(uriPrefix);
            IPAddress          pAddress           = EndPointManager.convertToIPAddress(httpListenerPrefix.Host);

            if (!pAddress.IsLocal())
            {
                throw new WebSocketSharp.Net.HttpListenerException(87, "Includes an invalid host.");
            }
            if (!int.TryParse(httpListenerPrefix.Port, out num))
            {
                throw new WebSocketSharp.Net.HttpListenerException(87, "Includes an invalid port.");
            }
            if (!num.IsPortNumber())
            {
                throw new WebSocketSharp.Net.HttpListenerException(87, "Includes an invalid port.");
            }
            string path = httpListenerPrefix.Path;

            if (path.IndexOf('%') != -1)
            {
                throw new WebSocketSharp.Net.HttpListenerException(87, "Includes an invalid path.");
            }
            if (path.IndexOf("//", StringComparison.Ordinal) != -1)
            {
                throw new WebSocketSharp.Net.HttpListenerException(87, "Includes an invalid path.");
            }
            IPEndPoint pEndPoint = new IPEndPoint(pAddress, num);

            if (!EndPointManager._endpoints.TryGetValue(pEndPoint, out endPointListener))
            {
                endPointListener = new EndPointListener(pEndPoint, httpListenerPrefix.IsSecure, listener.CertificateFolderPath, listener.SslConfiguration, listener.ReuseAddress);
                EndPointManager._endpoints.Add(pEndPoint, endPointListener);
            }
            else if (endPointListener.IsSecure ^ httpListenerPrefix.IsSecure)
            {
                throw new WebSocketSharp.Net.HttpListenerException(87, "Includes an invalid scheme.");
            }
            endPointListener.AddPrefix(httpListenerPrefix, listener);
        }
Esempio n. 10
0
        /*
         * Stops the server.
         */
        public void Stop()
        {
            // Throw an exception if the server isn't running.
            if (!this.Running)
            {
                throw new WebException("Server isn't running. Start the server before stopping.");
            }

            // Close the listener.
            this.Running = false;
            foreach (var prefix in this.Listener.Prefixes.ToArray())
            {
                this.Listener.Prefixes.Remove(prefix);
            }
            this.Listener.Stop();
            this.Listener = null;

            // Signal to end the loop and wait for the loop to end.
            this.ConnectionAcceptedEvent.Set();
            this.ConnectionLoopEndedEvent.WaitOne();
        }
Esempio n. 11
0
        private void Start(string host, int port, WebServerSslConfig sslConfig)
        {
            _listener = new HttpListener();

            if (sslConfig == null)
            {
                _logger.Info($"Starting HTTP server on {host}:{port}");
                _listener.Prefixes.Add($"http://{host}:{port}/");
            }
            else
            {
                _logger.Info($"Starting HTTPS server on {host}:{port}");
                _listener.Prefixes.Add($"https://{host}:{port}/");

                _listener.SslConfiguration.EnabledSslProtocols                 = sslConfig.EnabledSslProtocols;
                _listener.SslConfiguration.ServerCertificate                   = Utils.LoadPemCertificate(sslConfig.CertificatePath, sslConfig.KeyPath);
                _listener.SslConfiguration.ClientCertificateRequired           = sslConfig.ClientCertificateRequired;
                _listener.SslConfiguration.CheckCertificateRevocation          = false;
                _listener.SslConfiguration.ClientCertificateValidationCallback = sslConfig.ClientCertificateValidationCallback;
            }

            _listener.Start();
        }
        internal bool TrySearchHttpListener(Uri uri, out WebSocketSharp.Net.HttpListener listener)
        {
            bool flag;

            listener = null;
            if (uri != null)
            {
                string host  = uri.Host;
                bool   flag1 = Uri.CheckHostName(host) == UriHostNameType.Dns;
                string str   = uri.Port.ToString();
                string str1  = HttpUtility.UrlDecode(uri.AbsolutePath);
                string str2  = (str1[str1.Length - 1] != '/' ? string.Concat(str1, "/") : str1);
                if ((host == null ? false : host.Length > 0))
                {
                    int num = -1;
                    foreach (HttpListenerPrefix key in this._prefixes.Keys)
                    {
                        if (flag1)
                        {
                            string host1 = key.Host;
                            if ((Uri.CheckHostName(host1) != UriHostNameType.Dns ? false : host1 != host))
                            {
                                continue;
                            }
                        }
                        if (key.Port == str)
                        {
                            string path   = key.Path;
                            int    length = path.Length;
                            if (length >= num)
                            {
                                if ((str1.StartsWith(path) ? true : str2.StartsWith(path)))
                                {
                                    num      = length;
                                    listener = this._prefixes[key];
                                }
                            }
                        }
                    }
                    if (num != -1)
                    {
                        flag = true;
                        return(flag);
                    }
                }
                List <HttpListenerPrefix> httpListenerPrefixes = this._unhandled;
                listener = EndPointListener.searchHttpListenerFromSpecial(str1, httpListenerPrefixes);
                if ((listener != null ? false : str2 != str1))
                {
                    listener = EndPointListener.searchHttpListenerFromSpecial(str2, httpListenerPrefixes);
                }
                if (listener == null)
                {
                    httpListenerPrefixes = this._all;
                    listener             = EndPointListener.searchHttpListenerFromSpecial(str1, httpListenerPrefixes);
                    if ((listener != null ? false : str2 != str1))
                    {
                        listener = EndPointListener.searchHttpListenerFromSpecial(str2, httpListenerPrefixes);
                    }
                    flag = listener != null;
                }
                else
                {
                    flag = true;
                }
            }
            else
            {
                flag = false;
            }
            return(flag);
        }
        public void RemovePrefix(HttpListenerPrefix prefix, WebSocketSharp.Net.HttpListener listener)
        {
            List <HttpListenerPrefix> httpListenerPrefixes;
            List <HttpListenerPrefix> httpListenerPrefixes1;
            Dictionary <HttpListenerPrefix, WebSocketSharp.Net.HttpListener> httpListenerPrefixes2;
            Dictionary <HttpListenerPrefix, WebSocketSharp.Net.HttpListener> httpListenerPrefixes3;

            if (prefix.Host == "*")
            {
                do
                {
                    httpListenerPrefixes = this._unhandled;
                    if (httpListenerPrefixes != null)
                    {
                        httpListenerPrefixes1 = new List <HttpListenerPrefix>(httpListenerPrefixes);
                        if (EndPointListener.removeSpecial(httpListenerPrefixes1, prefix))
                        {
                            continue;
                        }
                        break;
                    }
                    else
                    {
                        break;
                    }
                }while (Interlocked.CompareExchange <List <HttpListenerPrefix> >(ref this._unhandled, httpListenerPrefixes1, httpListenerPrefixes) != httpListenerPrefixes);
                this.leaveIfNoPrefix();
            }
            else if (prefix.Host != "+")
            {
                do
                {
                    httpListenerPrefixes2 = this._prefixes;
                    if (httpListenerPrefixes2.ContainsKey(prefix))
                    {
                        httpListenerPrefixes3 = new Dictionary <HttpListenerPrefix, WebSocketSharp.Net.HttpListener>(httpListenerPrefixes2);
                        httpListenerPrefixes3.Remove(prefix);
                    }
                    else
                    {
                        break;
                    }
                }while (Interlocked.CompareExchange <Dictionary <HttpListenerPrefix, WebSocketSharp.Net.HttpListener> >(ref this._prefixes, httpListenerPrefixes3, httpListenerPrefixes2) != httpListenerPrefixes2);
                this.leaveIfNoPrefix();
            }
            else
            {
                do
                {
                    httpListenerPrefixes = this._all;
                    if (httpListenerPrefixes != null)
                    {
                        httpListenerPrefixes1 = new List <HttpListenerPrefix>(httpListenerPrefixes);
                        if (EndPointListener.removeSpecial(httpListenerPrefixes1, prefix))
                        {
                            continue;
                        }
                        break;
                    }
                    else
                    {
                        break;
                    }
                }while (Interlocked.CompareExchange <List <HttpListenerPrefix> >(ref this._all, httpListenerPrefixes1, httpListenerPrefixes) != httpListenerPrefixes);
                this.leaveIfNoPrefix();
            }
        }