|
|
|
@ -32,6 +32,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
using System;
|
|
|
|
using System;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
|
|
using System.Collections.Specialized;
|
|
|
|
using System.Configuration;
|
|
|
|
using System.Configuration;
|
|
|
|
using System.Diagnostics;
|
|
|
|
using System.Diagnostics;
|
|
|
|
using System.IO;
|
|
|
|
using System.IO;
|
|
|
|
@ -255,21 +256,17 @@ namespace WebSocketSharp
|
|
|
|
|
|
|
|
|
|
|
|
private void acceptHandshake()
|
|
|
|
private void acceptHandshake()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
var request = receiveOpeningHandshake();
|
|
|
|
var req = receiveOpeningHandshake();
|
|
|
|
#if DEBUG
|
|
|
|
|
|
|
|
Console.WriteLine("WS: Info@acceptHandshake: Opening handshake from client:\n");
|
|
|
|
|
|
|
|
Console.WriteLine(request.ToString());
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
string msg;
|
|
|
|
string msg;
|
|
|
|
if (!isValidRequest(request, out msg))
|
|
|
|
if (!isValidRequest(req, out msg))
|
|
|
|
throw new InvalidOperationException(msg);
|
|
|
|
{
|
|
|
|
|
|
|
|
error(msg);
|
|
|
|
|
|
|
|
close(CloseStatusCode.HANDSHAKE_FAILURE, msg);
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var response = createResponseHandshake();
|
|
|
|
sendResponseHandshake();
|
|
|
|
#if DEBUG
|
|
|
|
|
|
|
|
Console.WriteLine("WS: Info@acceptHandshake: Opening handshake from server:\n");
|
|
|
|
|
|
|
|
Console.WriteLine(response.ToString());
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
sendResponseHandshake(response);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ReadyState = WsState.OPEN;
|
|
|
|
ReadyState = WsState.OPEN;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -283,12 +280,12 @@ namespace WebSocketSharp
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (_readyState == WsState.CLOSING ||
|
|
|
|
if (_readyState == WsState.CLOSING ||
|
|
|
|
_readyState == WsState.CLOSED)
|
|
|
|
_readyState == WsState.CLOSED)
|
|
|
|
{
|
|
|
|
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (_readyState == WsState.CONNECTING)
|
|
|
|
if (_readyState == WsState.CONNECTING && !_isClient)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
OnClose.Emit(this, new CloseEventArgs(data));
|
|
|
|
OnClose.Emit(this, new CloseEventArgs(data));
|
|
|
|
|
|
|
|
sendResponseHandshakeForInvalid();
|
|
|
|
ReadyState = WsState.CLOSED;
|
|
|
|
ReadyState = WsState.CLOSED;
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -509,19 +506,15 @@ namespace WebSocketSharp
|
|
|
|
|
|
|
|
|
|
|
|
private void doHandshake()
|
|
|
|
private void doHandshake()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
var request = createOpeningHandshake();
|
|
|
|
var res = sendOpeningHandshake();
|
|
|
|
#if DEBUG
|
|
|
|
|
|
|
|
Console.WriteLine("WS: Info@doHandshake: Opening handshake from client:\n");
|
|
|
|
|
|
|
|
Console.WriteLine(request.ToString());
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
var response = sendOpeningHandshake(request);
|
|
|
|
|
|
|
|
#if DEBUG
|
|
|
|
|
|
|
|
Console.WriteLine("WS: Info@doHandshake: Opening handshake from server:\n");
|
|
|
|
|
|
|
|
Console.WriteLine(response.ToString());
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
string msg;
|
|
|
|
string msg;
|
|
|
|
if (!isValidResponse(response, out msg))
|
|
|
|
if (!isValidResponse(res, out msg))
|
|
|
|
throw new InvalidOperationException(msg);
|
|
|
|
{
|
|
|
|
|
|
|
|
error(msg);
|
|
|
|
|
|
|
|
close(CloseStatusCode.HANDSHAKE_FAILURE, msg);
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ReadyState = WsState.OPEN;
|
|
|
|
ReadyState = WsState.OPEN;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -860,10 +853,17 @@ namespace WebSocketSharp
|
|
|
|
|
|
|
|
|
|
|
|
private RequestHandshake receiveOpeningHandshake()
|
|
|
|
private RequestHandshake receiveOpeningHandshake()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (_context != null)
|
|
|
|
RequestHandshake req;
|
|
|
|
return RequestHandshake.Parse(_context);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return RequestHandshake.Parse(readHandshake());
|
|
|
|
if (_context == null)
|
|
|
|
|
|
|
|
req = RequestHandshake.Parse(readHandshake());
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
req = RequestHandshake.Parse(_context);
|
|
|
|
|
|
|
|
#if DEBUG
|
|
|
|
|
|
|
|
Console.WriteLine("WS: Info@receiveOpeningHandshake: Opening handshake from client:\n");
|
|
|
|
|
|
|
|
Console.WriteLine(req.ToString());
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
return req;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private bool send(WsFrame frame)
|
|
|
|
private bool send(WsFrame frame)
|
|
|
|
@ -999,15 +999,43 @@ namespace WebSocketSharp
|
|
|
|
return readLen;
|
|
|
|
return readLen;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private ResponseHandshake sendOpeningHandshake(RequestHandshake request)
|
|
|
|
private ResponseHandshake sendOpeningHandshake()
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
var req = createOpeningHandshake();
|
|
|
|
|
|
|
|
#if DEBUG
|
|
|
|
|
|
|
|
Console.WriteLine("WS: Info@sendOpeningHandshake: Opening handshake from client:\n");
|
|
|
|
|
|
|
|
Console.WriteLine(req.ToString());
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
_wsStream.Write(req.ToBytes(), 0, req.ToBytes().Length);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var res = ResponseHandshake.Parse(readHandshake());
|
|
|
|
|
|
|
|
#if DEBUG
|
|
|
|
|
|
|
|
Console.WriteLine("WS: Info@sendOpeningHandshake: Response handshake from server:\n");
|
|
|
|
|
|
|
|
Console.WriteLine(res.ToString());
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
return res;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void sendResponseHandshake()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
_wsStream.Write(request.ToBytes(), 0, request.ToBytes().Length);
|
|
|
|
var res = createResponseHandshake();
|
|
|
|
return ResponseHandshake.Parse(readHandshake());
|
|
|
|
#if DEBUG
|
|
|
|
|
|
|
|
Console.WriteLine("WS: Info@sendResponseHandshake: Response handshake from server:\n");
|
|
|
|
|
|
|
|
Console.WriteLine(res.ToString());
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
_wsStream.Write(res.ToBytes(), 0, res.ToBytes().Length);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void sendResponseHandshake(ResponseHandshake response)
|
|
|
|
private void sendResponseHandshakeForInvalid()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
_wsStream.Write(response.ToBytes(), 0, response.ToBytes().Length);
|
|
|
|
var code = (int)WebSocketSharp.Net.HttpStatusCode.BadRequest;
|
|
|
|
|
|
|
|
var res = new ResponseHandshake {
|
|
|
|
|
|
|
|
Headers = new NameValueCollection(),
|
|
|
|
|
|
|
|
Reason = "Bad Request",
|
|
|
|
|
|
|
|
StatusCode = code.ToString()
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_wsStream.Write(res.ToBytes(), 0, res.ToBytes().Length);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void startMessageThread()
|
|
|
|
private void startMessageThread()
|
|
|
|
|