|
|
|
@ -693,11 +693,12 @@ namespace WebSocketSharp
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// As client
|
|
|
|
// As client
|
|
|
|
private string checkIfValidHandshakeResponse (HandshakeResponse response)
|
|
|
|
private string checkIfValidHandshakeResponse (HttpResponse response)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
var headers = response.Headers;
|
|
|
|
var headers = response.Headers;
|
|
|
|
return response.IsUnauthorized
|
|
|
|
return response.IsUnauthorized
|
|
|
|
? String.Format ("HTTP {0} authorization is required.", response.AuthChallenge.Scheme)
|
|
|
|
? String.Format (
|
|
|
|
|
|
|
|
"HTTP {0} authorization is required.", response.AuthenticationChallenge.Scheme)
|
|
|
|
: !response.IsWebSocketResponse
|
|
|
|
: !response.IsWebSocketResponse
|
|
|
|
? "Not WebSocket connection response."
|
|
|
|
? "Not WebSocket connection response."
|
|
|
|
: !validateSecWebSocketAcceptHeader (headers ["Sec-WebSocket-Accept"])
|
|
|
|
: !validateSecWebSocketAcceptHeader (headers ["Sec-WebSocket-Accept"])
|
|
|
|
@ -897,6 +898,15 @@ namespace WebSocketSharp
|
|
|
|
: null;
|
|
|
|
: null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// As server
|
|
|
|
|
|
|
|
private HttpResponse createHandshakeCloseResponse (HttpStatusCode code)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
var res = HttpResponse.CreateCloseResponse (code);
|
|
|
|
|
|
|
|
res.Headers ["Sec-WebSocket-Version"] = _version;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return res;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// As client
|
|
|
|
// As client
|
|
|
|
private HttpRequest createHandshakeRequest ()
|
|
|
|
private HttpRequest createHandshakeRequest ()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
@ -936,11 +946,11 @@ namespace WebSocketSharp
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// As server
|
|
|
|
// As server
|
|
|
|
private HandshakeResponse createHandshakeResponse ()
|
|
|
|
private HttpResponse createHandshakeResponse ()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
var res = new HandshakeResponse (HttpStatusCode.SwitchingProtocols);
|
|
|
|
var res = HttpResponse.CreateWebSocketResponse ();
|
|
|
|
var headers = res.Headers;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var headers = res.Headers;
|
|
|
|
headers ["Sec-WebSocket-Accept"] = CreateResponseKey (_base64Key);
|
|
|
|
headers ["Sec-WebSocket-Accept"] = CreateResponseKey (_base64Key);
|
|
|
|
|
|
|
|
|
|
|
|
if (_protocol != null)
|
|
|
|
if (_protocol != null)
|
|
|
|
@ -955,15 +965,6 @@ namespace WebSocketSharp
|
|
|
|
return res;
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// As server
|
|
|
|
|
|
|
|
private HandshakeResponse createHandshakeResponse (HttpStatusCode code)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
var res = HandshakeResponse.CreateCloseResponse (code);
|
|
|
|
|
|
|
|
res.Headers ["Sec-WebSocket-Version"] = _version;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return res;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private MessageEventArgs dequeueFromMessageEventQueue ()
|
|
|
|
private MessageEventArgs dequeueFromMessageEventQueue ()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
lock (_forMessageEventQueue)
|
|
|
|
lock (_forMessageEventQueue)
|
|
|
|
@ -1043,7 +1044,7 @@ namespace WebSocketSharp
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// As client
|
|
|
|
// As client
|
|
|
|
private HandshakeResponse receiveHandshakeResponse ()
|
|
|
|
private HttpResponse receiveHandshakeResponse ()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
var res = _stream.ReadHandshakeResponse ();
|
|
|
|
var res = _stream.ReadHandshakeResponse ();
|
|
|
|
_logger.Debug ("A response to this WebSocket connection request:\n" + res.ToString ());
|
|
|
|
_logger.Debug ("A response to this WebSocket connection request:\n" + res.ToString ());
|
|
|
|
@ -1073,7 +1074,7 @@ namespace WebSocketSharp
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// As server
|
|
|
|
// As server
|
|
|
|
private bool send (HandshakeResponse response)
|
|
|
|
private bool send (HttpResponse response)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
_logger.Debug (
|
|
|
|
_logger.Debug (
|
|
|
|
"A response to the WebSocket connection request:\n" + response.ToString ());
|
|
|
|
"A response to the WebSocket connection request:\n" + response.ToString ());
|
|
|
|
@ -1226,12 +1227,12 @@ namespace WebSocketSharp
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// As client
|
|
|
|
// As client
|
|
|
|
private HandshakeResponse sendHandshakeRequest ()
|
|
|
|
private HttpResponse sendHandshakeRequest ()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
var req = createHandshakeRequest ();
|
|
|
|
var req = createHandshakeRequest ();
|
|
|
|
var res = sendHandshakeRequest (req);
|
|
|
|
var res = sendHandshakeRequest (req);
|
|
|
|
if (res.IsUnauthorized) {
|
|
|
|
if (res.IsUnauthorized) {
|
|
|
|
_authChallenge = res.AuthChallenge;
|
|
|
|
_authChallenge = res.AuthenticationChallenge;
|
|
|
|
if (_credentials != null &&
|
|
|
|
if (_credentials != null &&
|
|
|
|
(!_preAuth || _authChallenge.Scheme == AuthenticationSchemes.Digest)) {
|
|
|
|
(!_preAuth || _authChallenge.Scheme == AuthenticationSchemes.Digest)) {
|
|
|
|
if (res.Headers.Contains ("Connection", "close")) {
|
|
|
|
if (res.Headers.Contains ("Connection", "close")) {
|
|
|
|
@ -1250,7 +1251,7 @@ namespace WebSocketSharp
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// As client
|
|
|
|
// As client
|
|
|
|
private HandshakeResponse sendHandshakeRequest (HttpRequest request)
|
|
|
|
private HttpResponse sendHandshakeRequest (HttpRequest request)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
send (request);
|
|
|
|
send (request);
|
|
|
|
return receiveHandshakeResponse ();
|
|
|
|
return receiveHandshakeResponse ();
|
|
|
|
@ -1373,7 +1374,7 @@ namespace WebSocketSharp
|
|
|
|
#region Internal Methods
|
|
|
|
#region Internal Methods
|
|
|
|
|
|
|
|
|
|
|
|
// As server
|
|
|
|
// As server
|
|
|
|
internal void Close (HandshakeResponse response)
|
|
|
|
internal void Close (HttpResponse response)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
_readyState = WebSocketState.Closing;
|
|
|
|
_readyState = WebSocketState.Closing;
|
|
|
|
|
|
|
|
|
|
|
|
@ -1386,7 +1387,7 @@ namespace WebSocketSharp
|
|
|
|
// As server
|
|
|
|
// As server
|
|
|
|
internal void Close (HttpStatusCode code)
|
|
|
|
internal void Close (HttpStatusCode code)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
Close (createHandshakeResponse (code));
|
|
|
|
Close (createHandshakeCloseResponse (code));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// As server
|
|
|
|
// As server
|
|
|
|
|