Modified AcceptWebSocket method with subprotocol

This commit is contained in:
sta 2014-05-06 15:24:54 +09:00
parent b519af5f95
commit 85e567bd72
7 changed files with 37 additions and 12 deletions

View File

@ -510,9 +510,9 @@ namespace WebSocketSharp
} }
internal static TcpListenerWebSocketContext GetWebSocketContext ( 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) internal static bool IsCompressionExtension (this string value)

View File

@ -204,12 +204,34 @@ namespace WebSocketSharp.Net
/// A <see cref="HttpListenerWebSocketContext"/> that represents the WebSocket connection /// A <see cref="HttpListenerWebSocketContext"/> that represents the WebSocket connection
/// request. /// request.
/// </returns> /// </returns>
/// <param name="protocol">
/// A <see cref="string"/> that represents the subprotocol used in the WebSocket connection.
/// </param>
/// <param name="logger"> /// <param name="logger">
/// A <see cref="Logger"/> that provides the logging functions used in the WebSocket attempts. /// A <see cref="Logger"/> that provides the logging functions used in the WebSocket attempts.
/// </param> /// </param>
public HttpListenerWebSocketContext AcceptWebSocket (Logger logger) /// <exception cref="ArgumentException">
/// <para>
/// <paramref name="protocol"/> is empty.
/// </para>
/// <para>
/// -or-
/// </para>
/// <para>
/// <paramref name="protocol"/> contains an invalid character.
/// </para>
/// </exception>
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 #endregion

View File

@ -51,11 +51,12 @@ namespace WebSocketSharp.Net.WebSockets
#region Internal Constructors #region Internal Constructors
internal HttpListenerWebSocketContext (HttpListenerContext context, Logger logger) internal HttpListenerWebSocketContext (
HttpListenerContext context, string protocol, Logger logger)
{ {
_context = context; _context = context;
_stream = WsStream.CreateServerStream (context); _stream = WsStream.CreateServerStream (context);
_websocket = new WebSocket (this, logger ?? new Logger ()); _websocket = new WebSocket (this, protocol, logger);
} }
#endregion #endregion

View File

@ -59,7 +59,7 @@ namespace WebSocketSharp.Net.WebSockets
#region Internal Constructors #region Internal Constructors
internal TcpListenerWebSocketContext ( internal TcpListenerWebSocketContext (
TcpClient client, X509Certificate cert, bool secure, Logger logger) TcpClient client, string protocol, X509Certificate cert, bool secure, Logger logger)
{ {
_client = client; _client = client;
_secure = secure; _secure = secure;
@ -67,7 +67,7 @@ namespace WebSocketSharp.Net.WebSockets
_request = _stream.ReadHandshake<HandshakeRequest> ( _request = _stream.ReadHandshake<HandshakeRequest> (
HandshakeRequest.Parse, 90000); HandshakeRequest.Parse, 90000);
_websocket = new WebSocket (this, logger); _websocket = new WebSocket (this, protocol, logger);
} }
#endregion #endregion

View File

@ -489,7 +489,7 @@ namespace WebSocketSharp.Server
return; return;
if (context.Request.IsUpgradeTo ("websocket")) { if (context.Request.IsUpgradeTo ("websocket")) {
acceptWebSocketRequest (context.AcceptWebSocket (_logger)); acceptWebSocketRequest (context.AcceptWebSocket (null, _logger));
return; return;
} }

View File

@ -476,7 +476,7 @@ namespace WebSocketSharp.Server
ThreadPool.QueueUserWorkItem ( ThreadPool.QueueUserWorkItem (
state => { state => {
try { try {
var context = client.GetWebSocketContext (_cert, _secure, _logger); var context = client.GetWebSocketContext (null, _cert, _secure, _logger);
if (_authSchemes != AuthenticationSchemes.Anonymous && if (_authSchemes != AuthenticationSchemes.Anonymous &&
!authenticateRequest (_authSchemes, context)) !authenticateRequest (_authSchemes, context))
return; return;

View File

@ -106,9 +106,10 @@ namespace WebSocketSharp
#region Internal Constructors #region Internal Constructors
// As server // As server
internal WebSocket (HttpListenerWebSocketContext context, Logger logger) internal WebSocket (HttpListenerWebSocketContext context, string protocol, Logger logger)
{ {
_context = context; _context = context;
_protocol = protocol;
_logger = logger; _logger = logger;
_closeContext = context.Close; _closeContext = context.Close;
@ -120,9 +121,10 @@ namespace WebSocketSharp
} }
// As server // As server
internal WebSocket (TcpListenerWebSocketContext context, Logger logger) internal WebSocket (TcpListenerWebSocketContext context, string protocol, Logger logger)
{ {
_context = context; _context = context;
_protocol = protocol;
_logger = logger; _logger = logger;
_closeContext = context.Close; _closeContext = context.Close;