|
|
|
@ -500,7 +500,7 @@ namespace WebSocketSharp {
|
|
|
|
private bool acceptHandshake ()
|
|
|
|
private bool acceptHandshake ()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return processHandshakeRequest ()
|
|
|
|
return processHandshakeRequest ()
|
|
|
|
? send (createResponseHandshake ())
|
|
|
|
? send (createHandshakeResponse ())
|
|
|
|
: false;
|
|
|
|
: false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@ -532,7 +532,7 @@ namespace WebSocketSharp {
|
|
|
|
if (state == WsState.CONNECTING)
|
|
|
|
if (state == WsState.CONNECTING)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (!_client)
|
|
|
|
if (!_client)
|
|
|
|
args.WasClean = send (createResponseHandshake (HttpStatusCode.BadRequest));
|
|
|
|
args.WasClean = send (createHandshakeResponse (HttpStatusCode.BadRequest));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
else
|
|
|
|
{
|
|
|
|
{
|
|
|
|
@ -708,19 +708,6 @@ namespace WebSocketSharp {
|
|
|
|
return frame;
|
|
|
|
return frame;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// As client
|
|
|
|
|
|
|
|
private string createRequestExtensions()
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
var extensions = new StringBuilder(64);
|
|
|
|
|
|
|
|
var comp = createCompressionExtension(_compression);
|
|
|
|
|
|
|
|
if (comp.Length > 0)
|
|
|
|
|
|
|
|
extensions.Append(comp);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return extensions.Length > 0
|
|
|
|
|
|
|
|
? extensions.ToString()
|
|
|
|
|
|
|
|
: String.Empty;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// As client
|
|
|
|
// As client
|
|
|
|
private HandshakeRequest createHandshakeRequest ()
|
|
|
|
private HandshakeRequest createHandshakeRequest ()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
@ -756,9 +743,9 @@ namespace WebSocketSharp {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// As server
|
|
|
|
// As server
|
|
|
|
private ResponseHandshake createResponseHandshake()
|
|
|
|
private HandshakeResponse createHandshakeResponse ()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
var res = new ResponseHandshake();
|
|
|
|
var res = new HandshakeResponse ();
|
|
|
|
res.AddHeader ("Sec-WebSocket-Accept", createResponseKey ());
|
|
|
|
res.AddHeader ("Sec-WebSocket-Accept", createResponseKey ());
|
|
|
|
if (_extensions.Length > 0)
|
|
|
|
if (_extensions.Length > 0)
|
|
|
|
res.AddHeader ("Sec-WebSocket-Extensions", _extensions);
|
|
|
|
res.AddHeader ("Sec-WebSocket-Extensions", _extensions);
|
|
|
|
@ -770,14 +757,27 @@ namespace WebSocketSharp {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// As server
|
|
|
|
// As server
|
|
|
|
private ResponseHandshake createResponseHandshake(HttpStatusCode code)
|
|
|
|
private HandshakeResponse createHandshakeResponse (HttpStatusCode code)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
var res = ResponseHandshake.CreateCloseResponse(code);
|
|
|
|
var res = HandshakeResponse.CreateCloseResponse (code);
|
|
|
|
res.AddHeader ("Sec-WebSocket-Version", _version);
|
|
|
|
res.AddHeader ("Sec-WebSocket-Version", _version);
|
|
|
|
|
|
|
|
|
|
|
|
return res;
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// As client
|
|
|
|
|
|
|
|
private string createRequestExtensions ()
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
var extensions = new StringBuilder (64);
|
|
|
|
|
|
|
|
var comp = createCompressionExtension (_compression);
|
|
|
|
|
|
|
|
if (comp.Length > 0)
|
|
|
|
|
|
|
|
extensions.Append (comp);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return extensions.Length > 0
|
|
|
|
|
|
|
|
? extensions.ToString ()
|
|
|
|
|
|
|
|
: String.Empty;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private string createResponseKey ()
|
|
|
|
private string createResponseKey ()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
var buffer = new StringBuilder (_base64key, 64);
|
|
|
|
var buffer = new StringBuilder (_base64key, 64);
|
|
|
|
@ -792,7 +792,7 @@ namespace WebSocketSharp {
|
|
|
|
private bool doHandshake ()
|
|
|
|
private bool doHandshake ()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
setClientStream ();
|
|
|
|
setClientStream ();
|
|
|
|
return processResponseHandshake (sendHandshakeRequest ());
|
|
|
|
return processHandshakeResponse (sendHandshakeRequest ());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void error(string message)
|
|
|
|
private void error(string message)
|
|
|
|
@ -866,7 +866,7 @@ namespace WebSocketSharp {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// As client
|
|
|
|
// As client
|
|
|
|
private bool isValidResponseHandshake(ResponseHandshake response)
|
|
|
|
private bool isValidHandshakeResponse (HandshakeResponse response)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return !response.IsWebSocketResponse
|
|
|
|
return !response.IsWebSocketResponse
|
|
|
|
? false
|
|
|
|
? false
|
|
|
|
@ -1112,11 +1112,11 @@ namespace WebSocketSharp {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// As client
|
|
|
|
// As client
|
|
|
|
private bool processResponseHandshake(ResponseHandshake response)
|
|
|
|
private bool processHandshakeResponse (HandshakeResponse response)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
var msg = response.IsUnauthorized
|
|
|
|
var msg = response.IsUnauthorized
|
|
|
|
? String.Format ("An HTTP {0} authorization is required.", response.AuthChallenge.Scheme)
|
|
|
|
? String.Format ("An HTTP {0} authorization is required.", response.AuthChallenge.Scheme)
|
|
|
|
: !isValidResponseHandshake(response)
|
|
|
|
: !isValidHandshakeResponse (response)
|
|
|
|
? "Invalid response to this WebSocket connection request."
|
|
|
|
? "Invalid response to this WebSocket connection request."
|
|
|
|
: String.Empty;
|
|
|
|
: String.Empty;
|
|
|
|
|
|
|
|
|
|
|
|
@ -1144,10 +1144,10 @@ namespace WebSocketSharp {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// As client
|
|
|
|
// As client
|
|
|
|
private ResponseHandshake receiveResponseHandshake()
|
|
|
|
private HandshakeResponse receiveHandshakeResponse ()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
var res = ResponseHandshake.Parse(_stream.ReadHandshake());
|
|
|
|
var res = HandshakeResponse.Parse (_stream.ReadHandshake ());
|
|
|
|
_logger.Debug("Response handshake from server:\n" + res.ToString());
|
|
|
|
_logger.Debug ("A handshake response from the server:\n" + res.ToString ());
|
|
|
|
|
|
|
|
|
|
|
|
return res;
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -1160,9 +1160,9 @@ namespace WebSocketSharp {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// As server
|
|
|
|
// As server
|
|
|
|
private bool send (ResponseHandshake response)
|
|
|
|
private bool send (HandshakeResponse response)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
_logger.Debug ("Response handshake to client:\n" + response.ToString ());
|
|
|
|
_logger.Debug ("A handshake response to a client:\n" + response.ToString ());
|
|
|
|
return _stream.WriteHandshake (response);
|
|
|
|
return _stream.WriteHandshake (response);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@ -1301,7 +1301,7 @@ namespace WebSocketSharp {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// As client
|
|
|
|
// As client
|
|
|
|
private ResponseHandshake sendHandshakeRequest ()
|
|
|
|
private HandshakeResponse sendHandshakeRequest ()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
var req = createHandshakeRequest ();
|
|
|
|
var req = createHandshakeRequest ();
|
|
|
|
var res = sendHandshakeRequest (req);
|
|
|
|
var res = sendHandshakeRequest (req);
|
|
|
|
@ -1316,10 +1316,10 @@ namespace WebSocketSharp {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// As client
|
|
|
|
// As client
|
|
|
|
private ResponseHandshake sendHandshakeRequest (HandshakeRequest request)
|
|
|
|
private HandshakeResponse sendHandshakeRequest (HandshakeRequest request)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
send (request);
|
|
|
|
send (request);
|
|
|
|
return receiveResponseHandshake ();
|
|
|
|
return receiveHandshakeResponse ();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// As client
|
|
|
|
// As client
|
|
|
|
@ -1367,7 +1367,7 @@ namespace WebSocketSharp {
|
|
|
|
internal void Close (HttpStatusCode code)
|
|
|
|
internal void Close (HttpStatusCode code)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
_readyState = WsState.CLOSING;
|
|
|
|
_readyState = WsState.CLOSING;
|
|
|
|
send (createResponseHandshake (code));
|
|
|
|
send (createHandshakeResponse (code));
|
|
|
|
closeResources ();
|
|
|
|
closeResources ();
|
|
|
|
_readyState = WsState.CLOSED;
|
|
|
|
_readyState = WsState.CLOSED;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|