From 85e567bd72bae47ffc3989129fe7b0a9b377ed62 Mon Sep 17 00:00:00 2001 From: sta Date: Tue, 6 May 2014 15:24:54 +0900 Subject: [PATCH] Modified AcceptWebSocket method with subprotocol --- websocket-sharp/Ext.cs | 4 +-- websocket-sharp/Net/HttpListenerContext.cs | 26 +++++++++++++++++-- .../HttpListenerWebSocketContext.cs | 5 ++-- .../WebSockets/TcpListenerWebSocketContext.cs | 4 +-- websocket-sharp/Server/HttpServer.cs | 2 +- websocket-sharp/Server/WebSocketServer.cs | 2 +- websocket-sharp/WebSocket.cs | 6 +++-- 7 files changed, 37 insertions(+), 12 deletions(-) diff --git a/websocket-sharp/Ext.cs b/websocket-sharp/Ext.cs index b1c09412..09df2fa8 100644 --- a/websocket-sharp/Ext.cs +++ b/websocket-sharp/Ext.cs @@ -510,9 +510,9 @@ namespace WebSocketSharp } internal static TcpListenerWebSocketContext GetWebSocketContext ( - this TcpClient client, X509Certificate cert, bool secure, Logger logger) + this TcpClient client, string protocol, X509Certificate cert, bool secure, Logger logger) { - return new TcpListenerWebSocketContext (client, cert, secure, logger); + return new TcpListenerWebSocketContext (client, protocol, cert, secure, logger); } internal static bool IsCompressionExtension (this string value) diff --git a/websocket-sharp/Net/HttpListenerContext.cs b/websocket-sharp/Net/HttpListenerContext.cs index 60db71a1..290e7fc6 100644 --- a/websocket-sharp/Net/HttpListenerContext.cs +++ b/websocket-sharp/Net/HttpListenerContext.cs @@ -204,12 +204,34 @@ namespace WebSocketSharp.Net /// A that represents the WebSocket connection /// request. /// + /// + /// A that represents the subprotocol used in the WebSocket connection. + /// /// /// A that provides the logging functions used in the WebSocket attempts. /// - public HttpListenerWebSocketContext AcceptWebSocket (Logger logger) + /// + /// + /// is empty. + /// + /// + /// -or- + /// + /// + /// contains an invalid character. + /// + /// + public HttpListenerWebSocketContext AcceptWebSocket (string protocol, Logger logger) { - return new HttpListenerWebSocketContext (this, logger); + if (protocol != null) { + if (protocol.Length == 0) + throw new ArgumentException ("An empty string.", "protocol"); + + if (!protocol.IsToken ()) + throw new ArgumentException ("Contains an invalid character.", "protocol"); + } + + return new HttpListenerWebSocketContext (this, protocol, logger ?? new Logger ()); } #endregion diff --git a/websocket-sharp/Net/WebSockets/HttpListenerWebSocketContext.cs b/websocket-sharp/Net/WebSockets/HttpListenerWebSocketContext.cs index a6e7d01e..f1c2c2ff 100644 --- a/websocket-sharp/Net/WebSockets/HttpListenerWebSocketContext.cs +++ b/websocket-sharp/Net/WebSockets/HttpListenerWebSocketContext.cs @@ -51,11 +51,12 @@ namespace WebSocketSharp.Net.WebSockets #region Internal Constructors - internal HttpListenerWebSocketContext (HttpListenerContext context, Logger logger) + internal HttpListenerWebSocketContext ( + HttpListenerContext context, string protocol, Logger logger) { _context = context; _stream = WsStream.CreateServerStream (context); - _websocket = new WebSocket (this, logger ?? new Logger ()); + _websocket = new WebSocket (this, protocol, logger); } #endregion diff --git a/websocket-sharp/Net/WebSockets/TcpListenerWebSocketContext.cs b/websocket-sharp/Net/WebSockets/TcpListenerWebSocketContext.cs index 44b60cb2..3f364e9f 100644 --- a/websocket-sharp/Net/WebSockets/TcpListenerWebSocketContext.cs +++ b/websocket-sharp/Net/WebSockets/TcpListenerWebSocketContext.cs @@ -59,7 +59,7 @@ namespace WebSocketSharp.Net.WebSockets #region Internal Constructors internal TcpListenerWebSocketContext ( - TcpClient client, X509Certificate cert, bool secure, Logger logger) + TcpClient client, string protocol, X509Certificate cert, bool secure, Logger logger) { _client = client; _secure = secure; @@ -67,7 +67,7 @@ namespace WebSocketSharp.Net.WebSockets _request = _stream.ReadHandshake ( HandshakeRequest.Parse, 90000); - _websocket = new WebSocket (this, logger); + _websocket = new WebSocket (this, protocol, logger); } #endregion diff --git a/websocket-sharp/Server/HttpServer.cs b/websocket-sharp/Server/HttpServer.cs index a3886539..19e14a6e 100644 --- a/websocket-sharp/Server/HttpServer.cs +++ b/websocket-sharp/Server/HttpServer.cs @@ -489,7 +489,7 @@ namespace WebSocketSharp.Server return; if (context.Request.IsUpgradeTo ("websocket")) { - acceptWebSocketRequest (context.AcceptWebSocket (_logger)); + acceptWebSocketRequest (context.AcceptWebSocket (null, _logger)); return; } diff --git a/websocket-sharp/Server/WebSocketServer.cs b/websocket-sharp/Server/WebSocketServer.cs index 0f69ee98..c6996d77 100644 --- a/websocket-sharp/Server/WebSocketServer.cs +++ b/websocket-sharp/Server/WebSocketServer.cs @@ -476,7 +476,7 @@ namespace WebSocketSharp.Server ThreadPool.QueueUserWorkItem ( state => { try { - var context = client.GetWebSocketContext (_cert, _secure, _logger); + var context = client.GetWebSocketContext (null, _cert, _secure, _logger); if (_authSchemes != AuthenticationSchemes.Anonymous && !authenticateRequest (_authSchemes, context)) return; diff --git a/websocket-sharp/WebSocket.cs b/websocket-sharp/WebSocket.cs index 0f1ad645..da34a715 100644 --- a/websocket-sharp/WebSocket.cs +++ b/websocket-sharp/WebSocket.cs @@ -106,9 +106,10 @@ namespace WebSocketSharp #region Internal Constructors // As server - internal WebSocket (HttpListenerWebSocketContext context, Logger logger) + internal WebSocket (HttpListenerWebSocketContext context, string protocol, Logger logger) { _context = context; + _protocol = protocol; _logger = logger; _closeContext = context.Close; @@ -120,9 +121,10 @@ namespace WebSocketSharp } // As server - internal WebSocket (TcpListenerWebSocketContext context, Logger logger) + internal WebSocket (TcpListenerWebSocketContext context, string protocol, Logger logger) { _context = context; + _protocol = protocol; _logger = logger; _closeContext = context.Close;