|
|
|
@ -392,7 +392,11 @@ namespace WebSocketSharp
|
|
|
|
/// </value>
|
|
|
|
/// </value>
|
|
|
|
public string Protocol {
|
|
|
|
public string Protocol {
|
|
|
|
get {
|
|
|
|
get {
|
|
|
|
return _protocol;
|
|
|
|
return _protocol ?? String.Empty;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
internal set {
|
|
|
|
|
|
|
|
_protocol = value;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@ -593,9 +597,9 @@ namespace WebSocketSharp
|
|
|
|
_context.UserEndPoint,
|
|
|
|
_context.UserEndPoint,
|
|
|
|
_context));
|
|
|
|
_context));
|
|
|
|
|
|
|
|
|
|
|
|
var err = checkIfValidHandshakeRequest (_context);
|
|
|
|
var msg = checkIfValidHandshakeRequest (_context);
|
|
|
|
if (err != null) {
|
|
|
|
if (msg != null) {
|
|
|
|
_logger.Error (err);
|
|
|
|
_logger.Error (msg);
|
|
|
|
|
|
|
|
|
|
|
|
error ("An error has occurred while connecting.");
|
|
|
|
error ("An error has occurred while connecting.");
|
|
|
|
Close (HttpStatusCode.BadRequest);
|
|
|
|
Close (HttpStatusCode.BadRequest);
|
|
|
|
@ -603,11 +607,10 @@ namespace WebSocketSharp
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
_base64Key = _context.SecWebSocketKey;
|
|
|
|
if (_protocol != null &&
|
|
|
|
|
|
|
|
!_context.SecWebSocketProtocols.Contains (
|
|
|
|
if (_protocol.Length > 0 &&
|
|
|
|
protocol => protocol == _protocol))
|
|
|
|
!_context.Headers.Contains ("Sec-WebSocket-Protocol", _protocol))
|
|
|
|
_protocol = null;
|
|
|
|
_protocol = String.Empty;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var extensions = _context.Headers ["Sec-WebSocket-Extensions"];
|
|
|
|
var extensions = _context.Headers ["Sec-WebSocket-Extensions"];
|
|
|
|
if (extensions != null && extensions.Length > 0)
|
|
|
|
if (extensions != null && extensions.Length > 0)
|
|
|
|
@ -672,15 +675,15 @@ namespace WebSocketSharp
|
|
|
|
// As server
|
|
|
|
// As server
|
|
|
|
private string checkIfValidHandshakeRequest (WebSocketContext context)
|
|
|
|
private string checkIfValidHandshakeRequest (WebSocketContext context)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
string key, version;
|
|
|
|
var headers = context.Headers;
|
|
|
|
return !context.IsWebSocketRequest
|
|
|
|
return !context.IsWebSocketRequest
|
|
|
|
? "Not WebSocket connection request."
|
|
|
|
? "Not WebSocket connection request."
|
|
|
|
: !validateHostHeader (context.Host)
|
|
|
|
: !validateHostHeader (headers ["Host"])
|
|
|
|
? "Invalid Host header."
|
|
|
|
? "Invalid Host header."
|
|
|
|
: (key = context.SecWebSocketKey) == null || key.Length == 0
|
|
|
|
: !validateSecWebSocketKeyHeader (headers ["Sec-WebSocket-Key"])
|
|
|
|
? "Invalid Sec-WebSocket-Key header."
|
|
|
|
? "Invalid Sec-WebSocket-Key header."
|
|
|
|
: (version = context.SecWebSocketVersion) == null ||
|
|
|
|
: !validateSecWebSocketVersionClientHeader (
|
|
|
|
version != _version
|
|
|
|
headers ["Sec-WebSocket-Version"])
|
|
|
|
? "Invalid Sec-WebSocket-Version header."
|
|
|
|
? "Invalid Sec-WebSocket-Version header."
|
|
|
|
: !validateCookies (context.CookieCollection, _cookies)
|
|
|
|
: !validateCookies (context.CookieCollection, _cookies)
|
|
|
|
? "Invalid Cookies."
|
|
|
|
? "Invalid Cookies."
|
|
|
|
@ -703,7 +706,7 @@ namespace WebSocketSharp
|
|
|
|
: !validateSecWebSocketProtocolHeader (
|
|
|
|
: !validateSecWebSocketProtocolHeader (
|
|
|
|
headers ["Sec-WebSocket-Protocol"])
|
|
|
|
headers ["Sec-WebSocket-Protocol"])
|
|
|
|
? "Invalid Sec-WebSocket-Protocol header."
|
|
|
|
? "Invalid Sec-WebSocket-Protocol header."
|
|
|
|
: !validateSecWebSocketVersionHeader (
|
|
|
|
: !validateSecWebSocketVersionServerHeader (
|
|
|
|
headers ["Sec-WebSocket-Version"])
|
|
|
|
headers ["Sec-WebSocket-Version"])
|
|
|
|
? "Invalid Sec-WebSocket-Version header."
|
|
|
|
? "Invalid Sec-WebSocket-Version header."
|
|
|
|
: null;
|
|
|
|
: null;
|
|
|
|
@ -944,7 +947,7 @@ namespace WebSocketSharp
|
|
|
|
|
|
|
|
|
|
|
|
headers ["Sec-WebSocket-Accept"] = CreateResponseKey (_base64Key);
|
|
|
|
headers ["Sec-WebSocket-Accept"] = CreateResponseKey (_base64Key);
|
|
|
|
|
|
|
|
|
|
|
|
if (_protocol.Length > 0)
|
|
|
|
if (_protocol != null)
|
|
|
|
headers ["Sec-WebSocket-Protocol"] = _protocol;
|
|
|
|
headers ["Sec-WebSocket-Protocol"] = _protocol;
|
|
|
|
|
|
|
|
|
|
|
|
if (_extensions.Length > 0)
|
|
|
|
if (_extensions.Length > 0)
|
|
|
|
@ -1002,7 +1005,6 @@ namespace WebSocketSharp
|
|
|
|
_extensions = String.Empty;
|
|
|
|
_extensions = String.Empty;
|
|
|
|
_forConn = new object ();
|
|
|
|
_forConn = new object ();
|
|
|
|
_forSend = new object ();
|
|
|
|
_forSend = new object ();
|
|
|
|
_protocol = String.Empty;
|
|
|
|
|
|
|
|
_readyState = WebSocketState.CONNECTING;
|
|
|
|
_readyState = WebSocketState.CONNECTING;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@ -1381,6 +1383,16 @@ namespace WebSocketSharp
|
|
|
|
return value != null && value == CreateResponseKey (_base64Key);
|
|
|
|
return value != null && value == CreateResponseKey (_base64Key);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// As server
|
|
|
|
|
|
|
|
private bool validateSecWebSocketKeyHeader (string value)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (value == null || value.Length == 0)
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_base64Key = value;
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// As client
|
|
|
|
// As client
|
|
|
|
private bool validateSecWebSocketProtocolHeader (string value)
|
|
|
|
private bool validateSecWebSocketProtocolHeader (string value)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
@ -1395,8 +1407,14 @@ namespace WebSocketSharp
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// As server
|
|
|
|
|
|
|
|
private bool validateSecWebSocketVersionClientHeader (string value)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
return value != null && value == _version;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// As client
|
|
|
|
// As client
|
|
|
|
private bool validateSecWebSocketVersionHeader (string value)
|
|
|
|
private bool validateSecWebSocketVersionServerHeader (string value)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return value == null || value == _version;
|
|
|
|
return value == null || value == _version;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|