/// <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);
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(); }
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()); }