|
|
|
@ -715,24 +715,47 @@ namespace WebSocketSharp
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// As client
|
|
|
|
// As client
|
|
|
|
private string checkIfValidHandshakeResponse (HttpResponse response)
|
|
|
|
private bool checkIfValidHandshakeResponse (HttpResponse response, out string message)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
message = null;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (response.IsRedirect) {
|
|
|
|
|
|
|
|
message = "Indicates the redirection.";
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (response.IsUnauthorized) {
|
|
|
|
|
|
|
|
message = "Requires the authentication.";
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!response.IsWebSocketResponse) {
|
|
|
|
|
|
|
|
message = "Not a WebSocket connection response.";
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var headers = response.Headers;
|
|
|
|
var headers = response.Headers;
|
|
|
|
return response.IsRedirect
|
|
|
|
if (!validateSecWebSocketAcceptHeader (headers["Sec-WebSocket-Accept"])) {
|
|
|
|
? "Indicates the redirection."
|
|
|
|
message = "Includes an invalid Sec-WebSocket-Accept header.";
|
|
|
|
: response.IsUnauthorized
|
|
|
|
return false;
|
|
|
|
? "Requires the authentication."
|
|
|
|
}
|
|
|
|
: !response.IsWebSocketResponse
|
|
|
|
|
|
|
|
? "Not a WebSocket connection response."
|
|
|
|
if (!validateSecWebSocketProtocolHeader (headers["Sec-WebSocket-Protocol"])) {
|
|
|
|
: !validateSecWebSocketAcceptHeader (headers["Sec-WebSocket-Accept"])
|
|
|
|
message = "Includes an invalid Sec-WebSocket-Protocol header.";
|
|
|
|
? "Includes an invalid Sec-WebSocket-Accept header."
|
|
|
|
return false;
|
|
|
|
: !validateSecWebSocketProtocolHeader (headers["Sec-WebSocket-Protocol"])
|
|
|
|
}
|
|
|
|
? "Includes an invalid Sec-WebSocket-Protocol header."
|
|
|
|
|
|
|
|
: !validateSecWebSocketExtensionsHeader (headers["Sec-WebSocket-Extensions"])
|
|
|
|
if (!validateSecWebSocketExtensionsHeader (headers["Sec-WebSocket-Extensions"])) {
|
|
|
|
? "Includes an invalid Sec-WebSocket-Extensions header."
|
|
|
|
message = "Includes an invalid Sec-WebSocket-Extensions header.";
|
|
|
|
: !validateSecWebSocketVersionServerHeader (headers["Sec-WebSocket-Version"])
|
|
|
|
return false;
|
|
|
|
? "Includes an invalid Sec-WebSocket-Version header."
|
|
|
|
}
|
|
|
|
: null;
|
|
|
|
|
|
|
|
|
|
|
|
if (!validateSecWebSocketVersionServerHeader (headers["Sec-WebSocket-Version"])) {
|
|
|
|
|
|
|
|
message = "Includes an invalid Sec-WebSocket-Version header.";
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private bool checkIfValidReceivedFrame (WebSocketFrame frame, out string message)
|
|
|
|
private bool checkIfValidReceivedFrame (WebSocketFrame frame, out string message)
|
|
|
|
@ -956,8 +979,9 @@ namespace WebSocketSharp
|
|
|
|
{
|
|
|
|
{
|
|
|
|
setClientStream ();
|
|
|
|
setClientStream ();
|
|
|
|
var res = sendHandshakeRequest ();
|
|
|
|
var res = sendHandshakeRequest ();
|
|
|
|
var msg = checkIfValidHandshakeResponse (res);
|
|
|
|
|
|
|
|
if (msg != null)
|
|
|
|
string msg;
|
|
|
|
|
|
|
|
if (!checkIfValidHandshakeResponse (res, out msg))
|
|
|
|
throw new WebSocketException (CloseStatusCode.ProtocolError, msg);
|
|
|
|
throw new WebSocketException (CloseStatusCode.ProtocolError, msg);
|
|
|
|
|
|
|
|
|
|
|
|
var cookies = res.Cookies;
|
|
|
|
var cookies = res.Cookies;
|
|
|
|
|