Пример #1
0
 /// <summary>
 /// Accepts a WebSocket connection request.
 /// </summary>
 /// <param name="context">
 /// A <see cref="TcpListenerWebSocketContext"/> that contains the WebSocket connection request objects.
 /// </param>
 protected abstract void AcceptWebSocket(TcpListenerWebSocketContext context);
Пример #2
0
        private void receiveRequest()
        {
            while (true)
            {
                TcpClient cl = null;

                try {
                    cl = _listener.AcceptTcpClient();

                    ThreadPool.QueueUserWorkItem(
                        state => {
                        try {
                            var ctx = new TcpListenerWebSocketContext(
                                cl, null, _secure, _sslConfigInUse, _log
                                );

                            processRequest(ctx);
                        }
                        catch (Exception ex) {
                            _log.Error(ex.Message);
                            _log.Debug(ex.ToString());

                            cl.Close();
                        }
                    }
                        );
                }
                catch (SocketException ex) {
                    if (_state == ServerState.ShuttingDown)
                    {
                        _log.Info("The underlying listener is stopped.");

                        return;
                    }

                    _log.Fatal(ex.Message);
                    _log.Debug(ex.ToString());

                    break;
                }
                catch (InvalidOperationException ex) {
                    if (_state == ServerState.ShuttingDown)
                    {
                        _log.Info("The underlying listener is stopped.");

                        return;
                    }

                    _log.Fatal(ex.Message);
                    _log.Debug(ex.ToString());

                    break;
                }
                catch (Exception ex) {
                    _log.Fatal(ex.Message);
                    _log.Debug(ex.ToString());

                    if (cl != null)
                    {
                        cl.Close();
                    }

                    if (_state == ServerState.ShuttingDown)
                    {
                        return;
                    }

                    break;
                }
            }

            abort();
        }
Пример #3
0
        private bool authenticateRequest(WebSocketSharp.Net.AuthenticationSchemes scheme, TcpListenerWebSocketContext context)
        {
            string challenge = (scheme != WebSocketSharp.Net.AuthenticationSchemes.Basic) ? ((scheme != WebSocketSharp.Net.AuthenticationSchemes.Digest) ? null : HttpUtility.CreateDigestAuthChallenge(this.Realm)) : HttpUtility.CreateBasicAuthChallenge(this.Realm);

            if (challenge == null)
            {
                context.Close(WebSocketSharp.Net.HttpStatusCode.Forbidden);
                return(false);
            }
            int    retry    = -1;
            string expected = scheme.ToString();
            string realm    = this.Realm;
            Func <IIdentity, WebSocketSharp.Net.NetworkCredential> credentialsFinder = this.UserCredentialsFinder;
            Func <bool> auth = null;

            auth = delegate()
            {
                retry++;
                if (retry > 99)
                {
                    context.Close(WebSocketSharp.Net.HttpStatusCode.Forbidden);
                    return(false);
                }
                string text = context.Headers["Authorization"];
                if (text == null || !text.StartsWith(expected, StringComparison.OrdinalIgnoreCase))
                {
                    context.SendAuthChallenge(challenge);
                    return(auth());
                }
                context.SetUser(scheme, realm, credentialsFinder);
                if (context.IsAuthenticated)
                {
                    return(true);
                }
                context.SendAuthChallenge(challenge);
                return(auth());
            };
            return(auth());
        }