|
|
|
|
@ -45,8 +45,8 @@ using System.Threading;
|
|
|
|
|
using WebSocketSharp.Net;
|
|
|
|
|
using WebSocketSharp.Net.WebSockets;
|
|
|
|
|
|
|
|
|
|
namespace WebSocketSharp {
|
|
|
|
|
|
|
|
|
|
namespace WebSocketSharp
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Implements the WebSocket interface.
|
|
|
|
|
/// </summary>
|
|
|
|
|
@ -499,9 +499,29 @@ namespace WebSocketSharp {
|
|
|
|
|
// As server
|
|
|
|
|
private bool acceptHandshake ()
|
|
|
|
|
{
|
|
|
|
|
return processHandshakeRequest ()
|
|
|
|
|
? send (createHandshakeResponse ())
|
|
|
|
|
: false;
|
|
|
|
|
_logger.Debug (String.Format ("A WebSocket connection request from {0}:\n{1}",
|
|
|
|
|
_context.UserEndPoint, _context));
|
|
|
|
|
|
|
|
|
|
if (!validateConnectionRequest (_context))
|
|
|
|
|
{
|
|
|
|
|
var msg = "Invalid WebSocket connection request.";
|
|
|
|
|
_logger.Error (msg);
|
|
|
|
|
error (msg);
|
|
|
|
|
Close (HttpStatusCode.BadRequest);
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_base64key = _context.SecWebSocketKey;
|
|
|
|
|
|
|
|
|
|
if (_protocol.Length > 0 && !_context.Headers.Contains ("Sec-WebSocket-Protocol", _protocol))
|
|
|
|
|
_protocol = String.Empty;
|
|
|
|
|
|
|
|
|
|
var extensions = _context.Headers ["Sec-WebSocket-Extensions"];
|
|
|
|
|
if (extensions != null && extensions.Length > 0)
|
|
|
|
|
processRequestedExtensions (extensions);
|
|
|
|
|
|
|
|
|
|
return send (createHandshakeResponse ());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void close (CloseEventArgs eventArgs)
|
|
|
|
|
@ -532,7 +552,10 @@ namespace WebSocketSharp {
|
|
|
|
|
if (state == WsState.CONNECTING)
|
|
|
|
|
{
|
|
|
|
|
if (!_client)
|
|
|
|
|
args.WasClean = send (createHandshakeResponse (HttpStatusCode.BadRequest));
|
|
|
|
|
{
|
|
|
|
|
close (HttpStatusCode.BadRequest);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
@ -545,6 +568,14 @@ namespace WebSocketSharp {
|
|
|
|
|
_logger.Trace ("Exit close method.");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// As server
|
|
|
|
|
private void close (HttpStatusCode code)
|
|
|
|
|
{
|
|
|
|
|
send (createHandshakeResponse (code));
|
|
|
|
|
closeResources ();
|
|
|
|
|
_readyState = WsState.CLOSED;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void close (ushort code, string reason)
|
|
|
|
|
{
|
|
|
|
|
var data = code.Append (reason);
|
|
|
|
|
@ -672,11 +703,6 @@ namespace WebSocketSharp {
|
|
|
|
|
return Convert.ToBase64String (src);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static string createCompressionExtension(CompressionMethod method)
|
|
|
|
|
{
|
|
|
|
|
return createCurrentCompressionExtension(method);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static WsFrame createControlFrame (Opcode opcode, PayloadData payloadData, bool client)
|
|
|
|
|
{
|
|
|
|
|
var mask = client ? Mask.MASK : Mask.UNMASK;
|
|
|
|
|
@ -685,20 +711,6 @@ namespace WebSocketSharp {
|
|
|
|
|
return frame;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static string createCurrentCompressionExtension(CompressionMethod method)
|
|
|
|
|
{
|
|
|
|
|
return method != CompressionMethod.NONE
|
|
|
|
|
? String.Format("permessage-{0}", method.ToString().ToLower())
|
|
|
|
|
: String.Empty;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static string createDeprecatedCompressionExtension(CompressionMethod method)
|
|
|
|
|
{
|
|
|
|
|
return method != CompressionMethod.NONE
|
|
|
|
|
? String.Format("permessage-compress; method={0}", method.ToString().ToLower())
|
|
|
|
|
: String.Empty;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static WsFrame createFrame (
|
|
|
|
|
Fin fin, Opcode opcode, PayloadData payloadData, bool compressed, bool client)
|
|
|
|
|
{
|
|
|
|
|
@ -747,6 +759,10 @@ namespace WebSocketSharp {
|
|
|
|
|
{
|
|
|
|
|
var res = new HandshakeResponse ();
|
|
|
|
|
res.AddHeader ("Sec-WebSocket-Accept", createResponseKey ());
|
|
|
|
|
|
|
|
|
|
if (_protocol.Length > 0)
|
|
|
|
|
res.AddHeader ("Sec-WebSocket-Protocol", _protocol);
|
|
|
|
|
|
|
|
|
|
if (_extensions.Length > 0)
|
|
|
|
|
res.AddHeader ("Sec-WebSocket-Extensions", _extensions);
|
|
|
|
|
|
|
|
|
|
@ -769,9 +785,8 @@ namespace WebSocketSharp {
|
|
|
|
|
private string createRequestExtensions ()
|
|
|
|
|
{
|
|
|
|
|
var extensions = new StringBuilder (64);
|
|
|
|
|
var comp = createCompressionExtension (_compression);
|
|
|
|
|
if (comp.Length > 0)
|
|
|
|
|
extensions.Append (comp);
|
|
|
|
|
if (_compression != CompressionMethod.NONE)
|
|
|
|
|
extensions.Append (_compression.ToCompressionExtension ());
|
|
|
|
|
|
|
|
|
|
return extensions.Length > 0
|
|
|
|
|
? extensions.ToString ()
|
|
|
|
|
@ -792,88 +807,47 @@ namespace WebSocketSharp {
|
|
|
|
|
private bool doHandshake ()
|
|
|
|
|
{
|
|
|
|
|
setClientStream ();
|
|
|
|
|
return processHandshakeResponse (sendHandshakeRequest ());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void error(string message)
|
|
|
|
|
{
|
|
|
|
|
OnError.Emit(this, new ErrorEventArgs(message));
|
|
|
|
|
}
|
|
|
|
|
var res = sendHandshakeRequest ();
|
|
|
|
|
var msg = res.IsUnauthorized
|
|
|
|
|
? String.Format ("An HTTP {0} authorization is required.", res.AuthChallenge.Scheme)
|
|
|
|
|
: !validateConnectionResponse (res)
|
|
|
|
|
? "Invalid response to this WebSocket connection request."
|
|
|
|
|
: String.Empty;
|
|
|
|
|
|
|
|
|
|
private static CompressionMethod getCompressionMethod(string value)
|
|
|
|
|
if (msg.Length > 0)
|
|
|
|
|
{
|
|
|
|
|
var deprecated = createDeprecatedCompressionExtension(CompressionMethod.DEFLATE);
|
|
|
|
|
if (value.Equals(deprecated))
|
|
|
|
|
return CompressionMethod.DEFLATE;
|
|
|
|
|
|
|
|
|
|
foreach (CompressionMethod method in Enum.GetValues(typeof(CompressionMethod)))
|
|
|
|
|
if (isCompressionExtension(value, method))
|
|
|
|
|
return method;
|
|
|
|
|
_logger.Error (msg);
|
|
|
|
|
error (msg);
|
|
|
|
|
Close (CloseStatusCode.ABNORMAL, msg);
|
|
|
|
|
|
|
|
|
|
return CompressionMethod.NONE;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// As server
|
|
|
|
|
private void init(WebSocketContext context)
|
|
|
|
|
{
|
|
|
|
|
_context = context;
|
|
|
|
|
_uri = context.Path.ToUri();
|
|
|
|
|
_secure = context.IsSecureConnection;
|
|
|
|
|
_client = false;
|
|
|
|
|
}
|
|
|
|
|
var protocol = res.Headers ["Sec-WebSocket-Protocol"];
|
|
|
|
|
if (protocol != null && protocol.Length > 0)
|
|
|
|
|
_protocol = protocol;
|
|
|
|
|
|
|
|
|
|
private static bool isCompressionExtension(string value)
|
|
|
|
|
{
|
|
|
|
|
return value.StartsWith("permessage-");
|
|
|
|
|
}
|
|
|
|
|
processRespondedExtensions (res.Headers ["Sec-WebSocket-Extensions"]);
|
|
|
|
|
|
|
|
|
|
private static bool isCompressionExtension(string value, CompressionMethod method)
|
|
|
|
|
{
|
|
|
|
|
var expected = createCompressionExtension(method);
|
|
|
|
|
return expected.Length > 0
|
|
|
|
|
? value.Equals(expected)
|
|
|
|
|
: false;
|
|
|
|
|
}
|
|
|
|
|
var cookies = res.Cookies;
|
|
|
|
|
if (cookies.Count > 0)
|
|
|
|
|
_cookies.SetOrRemove (cookies);
|
|
|
|
|
|
|
|
|
|
// As server
|
|
|
|
|
private bool isValidHostHeader()
|
|
|
|
|
{
|
|
|
|
|
var authority = _context.Headers["Host"];
|
|
|
|
|
if (authority.IsNullOrEmpty() || !_uri.IsAbsoluteUri)
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
var i = authority.IndexOf(':');
|
|
|
|
|
var host = i > 0
|
|
|
|
|
? authority.Substring(0, i)
|
|
|
|
|
: authority;
|
|
|
|
|
var type = Uri.CheckHostName(host);
|
|
|
|
|
|
|
|
|
|
return type != UriHostNameType.Dns
|
|
|
|
|
? true
|
|
|
|
|
: Uri.CheckHostName(_uri.DnsSafeHost) != UriHostNameType.Dns
|
|
|
|
|
? true
|
|
|
|
|
: host == _uri.DnsSafeHost;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// As server
|
|
|
|
|
private bool isValidRequesHandshake()
|
|
|
|
|
private void error (string message)
|
|
|
|
|
{
|
|
|
|
|
return !_context.IsValid
|
|
|
|
|
? false
|
|
|
|
|
: !isValidHostHeader()
|
|
|
|
|
? false
|
|
|
|
|
: _context.Headers.Contains("Sec-WebSocket-Version", _version);
|
|
|
|
|
OnError.Emit (this, new ErrorEventArgs (message));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// As client
|
|
|
|
|
private bool isValidHandshakeResponse (HandshakeResponse response)
|
|
|
|
|
// As server
|
|
|
|
|
private void init (WebSocketContext context)
|
|
|
|
|
{
|
|
|
|
|
return !response.IsWebSocketResponse
|
|
|
|
|
? false
|
|
|
|
|
: !response.ContainsHeader ("Sec-WebSocket-Accept", createResponseKey ())
|
|
|
|
|
? false
|
|
|
|
|
: !response.ContainsHeader ("Sec-WebSocket-Version") ||
|
|
|
|
|
response.ContainsHeader ("Sec-WebSocket-Version", _version);
|
|
|
|
|
_context = context;
|
|
|
|
|
_uri = context.Path.ToUri ();
|
|
|
|
|
_secure = context.IsSecureConnection;
|
|
|
|
|
_client = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void open ()
|
|
|
|
|
@ -1025,25 +999,22 @@ namespace WebSocketSharp {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// As server
|
|
|
|
|
private void processRequestExtensions(string extensions)
|
|
|
|
|
private void processRequestedExtensions (string extensions)
|
|
|
|
|
{
|
|
|
|
|
if (extensions.IsNullOrEmpty())
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
var comp = false;
|
|
|
|
|
var buffer = new List<string> ();
|
|
|
|
|
foreach (var extension in extensions.SplitHeaderValue(','))
|
|
|
|
|
foreach (var e in extensions.SplitHeaderValue (','))
|
|
|
|
|
{
|
|
|
|
|
var e = extension.Trim();
|
|
|
|
|
var tmp = e.RemovePrefix("x-webkit-");
|
|
|
|
|
if (!comp && isCompressionExtension(tmp))
|
|
|
|
|
var extension = e.Trim ();
|
|
|
|
|
var tmp = extension.RemovePrefix ("x-webkit-");
|
|
|
|
|
if (!comp && tmp.IsCompressionExtension ())
|
|
|
|
|
{
|
|
|
|
|
var method = getCompressionMethod(tmp);
|
|
|
|
|
var method = tmp.ToCompressionMethod ();
|
|
|
|
|
if (method != CompressionMethod.NONE)
|
|
|
|
|
{
|
|
|
|
|
_compression = method;
|
|
|
|
|
comp = true;
|
|
|
|
|
buffer.Add(e);
|
|
|
|
|
buffer.Add (extension);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@ -1052,102 +1023,32 @@ namespace WebSocketSharp {
|
|
|
|
|
_extensions = buffer.ToArray ().ToString (", ");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// As server
|
|
|
|
|
private bool processHandshakeRequest ()
|
|
|
|
|
{
|
|
|
|
|
var req = HandshakeRequest.Parse (_context);
|
|
|
|
|
_logger.Debug ("A handshake request from a client:\n" + req.ToString ());
|
|
|
|
|
if (!isValidRequesHandshake ())
|
|
|
|
|
{
|
|
|
|
|
var msg = "Invalid WebSocket connection request.";
|
|
|
|
|
_logger.Error (msg);
|
|
|
|
|
error (msg);
|
|
|
|
|
Close (HttpStatusCode.BadRequest);
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_base64key = _context.SecWebSocketKey;
|
|
|
|
|
|
|
|
|
|
var protocols = _context.Headers ["Sec-WebSocket-Protocol"];
|
|
|
|
|
if (!protocols.IsNullOrEmpty ())
|
|
|
|
|
_protocols = protocols;
|
|
|
|
|
|
|
|
|
|
processRequestExtensions (_context.Headers ["Sec-WebSocket-Extensions"]);
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// As client
|
|
|
|
|
private void processResponseCookies(CookieCollection cookies)
|
|
|
|
|
private void processRespondedExtensions (string extensions)
|
|
|
|
|
{
|
|
|
|
|
if (cookies.Count > 0)
|
|
|
|
|
_cookies.SetOrRemove(cookies);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// As client
|
|
|
|
|
private void processResponseExtensions(string extensions)
|
|
|
|
|
var comp = _compression != CompressionMethod.NONE ? true : false;
|
|
|
|
|
var hasComp = false;
|
|
|
|
|
if (extensions != null && extensions.Length > 0)
|
|
|
|
|
{
|
|
|
|
|
var checkComp = _compression != CompressionMethod.NONE
|
|
|
|
|
? true
|
|
|
|
|
: false;
|
|
|
|
|
|
|
|
|
|
var comp = false;
|
|
|
|
|
if (!extensions.IsNullOrEmpty())
|
|
|
|
|
{
|
|
|
|
|
foreach (var extension in extensions.SplitHeaderValue(','))
|
|
|
|
|
foreach (var e in extensions.SplitHeaderValue (','))
|
|
|
|
|
{
|
|
|
|
|
var e = extension.Trim();
|
|
|
|
|
if (checkComp &&
|
|
|
|
|
!comp &&
|
|
|
|
|
isCompressionExtension(e, _compression))
|
|
|
|
|
comp = true;
|
|
|
|
|
var extension = e.Trim ();
|
|
|
|
|
if (comp && !hasComp && extension.Equals (_compression))
|
|
|
|
|
hasComp = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_extensions = extensions;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (checkComp && !comp)
|
|
|
|
|
if (comp && !hasComp)
|
|
|
|
|
_compression = CompressionMethod.NONE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// As client
|
|
|
|
|
private bool processHandshakeResponse (HandshakeResponse response)
|
|
|
|
|
{
|
|
|
|
|
var msg = response.IsUnauthorized
|
|
|
|
|
? String.Format ("An HTTP {0} authorization is required.", response.AuthChallenge.Scheme)
|
|
|
|
|
: !isValidHandshakeResponse (response)
|
|
|
|
|
? "Invalid response to this WebSocket connection request."
|
|
|
|
|
: String.Empty;
|
|
|
|
|
|
|
|
|
|
if (msg.Length > 0)
|
|
|
|
|
{
|
|
|
|
|
_logger.Error (msg);
|
|
|
|
|
error (msg);
|
|
|
|
|
Close (CloseStatusCode.ABNORMAL, msg);
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
processResponseProtocol (response.Headers ["Sec-WebSocket-Protocol"]);
|
|
|
|
|
processResponseExtensions (response.Headers ["Sec-WebSocket-Extensions"]);
|
|
|
|
|
processResponseCookies (response.Cookies);
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// As client
|
|
|
|
|
private void processResponseProtocol(string protocol)
|
|
|
|
|
{
|
|
|
|
|
if (!protocol.IsNullOrEmpty())
|
|
|
|
|
_protocol = protocol;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// As client
|
|
|
|
|
private HandshakeResponse receiveHandshakeResponse ()
|
|
|
|
|
{
|
|
|
|
|
var res = HandshakeResponse.Parse (_stream.ReadHandshake ());
|
|
|
|
|
_logger.Debug ("A handshake response from the server:\n" + res.ToString ());
|
|
|
|
|
_logger.Debug ("A response to this WebSocket connection request:\n" + res.ToString ());
|
|
|
|
|
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
@ -1155,14 +1056,15 @@ namespace WebSocketSharp {
|
|
|
|
|
// As client
|
|
|
|
|
private void send (HandshakeRequest request)
|
|
|
|
|
{
|
|
|
|
|
_logger.Debug ("A handshake Request to the server:\n" + request.ToString ());
|
|
|
|
|
_logger.Debug (String.Format ("A WebSocket connection request to {0}:\n{1}",
|
|
|
|
|
_uri, request));
|
|
|
|
|
_stream.WriteHandshake (request);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// As server
|
|
|
|
|
private bool send (HandshakeResponse response)
|
|
|
|
|
{
|
|
|
|
|
_logger.Debug ("A handshake response to a client:\n" + response.ToString ());
|
|
|
|
|
_logger.Debug ("A response to a WebSocket connection request:\n" + response.ToString ());
|
|
|
|
|
return _stream.WriteHandshake (response);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -1195,8 +1097,7 @@ namespace WebSocketSharp {
|
|
|
|
|
{
|
|
|
|
|
var data = stream;
|
|
|
|
|
var compressed = false;
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
try {
|
|
|
|
|
if (_readyState != WsState.OPEN)
|
|
|
|
|
{
|
|
|
|
|
var msg = "The WebSocket connection isn't established or has been closed.";
|
|
|
|
|
@ -1221,13 +1122,11 @@ namespace WebSocketSharp {
|
|
|
|
|
sendFragmented (opcode, data, compressed);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
catch (Exception ex) {
|
|
|
|
|
_logger.Fatal (ex.Message);
|
|
|
|
|
error ("An exception has occured.");
|
|
|
|
|
}
|
|
|
|
|
finally
|
|
|
|
|
{
|
|
|
|
|
finally {
|
|
|
|
|
if (compressed)
|
|
|
|
|
data.Dispose ();
|
|
|
|
|
|
|
|
|
|
@ -1246,8 +1145,7 @@ namespace WebSocketSharp {
|
|
|
|
|
Action<Opcode, Stream> sender = send;
|
|
|
|
|
AsyncCallback callback = ar =>
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
try {
|
|
|
|
|
sender.EndInvoke (ar);
|
|
|
|
|
if (completed != null)
|
|
|
|
|
completed ();
|
|
|
|
|
@ -1359,6 +1257,42 @@ namespace WebSocketSharp {
|
|
|
|
|
_stream.ReadFrameAsync (completed);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// As server
|
|
|
|
|
private bool validateConnectionRequest (WebSocketContext context)
|
|
|
|
|
{
|
|
|
|
|
return context.IsWebSocketRequest &&
|
|
|
|
|
validateHostHeader (context.Host) &&
|
|
|
|
|
!context.SecWebSocketKey.IsNullOrEmpty () &&
|
|
|
|
|
context.Headers.Contains ("Sec-WebSocket-Version", _version);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// As client
|
|
|
|
|
private bool validateConnectionResponse (HandshakeResponse response)
|
|
|
|
|
{
|
|
|
|
|
return response.IsWebSocketResponse &&
|
|
|
|
|
response.Headers.Contains ("Sec-WebSocket-Accept", createResponseKey ()) &&
|
|
|
|
|
(!response.Headers.Contains ("Sec-WebSocket-Version") ||
|
|
|
|
|
response.Headers.Contains ("Sec-WebSocket-Version", _version));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// As server
|
|
|
|
|
private bool validateHostHeader (string value)
|
|
|
|
|
{
|
|
|
|
|
if (value == null || value.Length == 0)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
if (!_uri.IsAbsoluteUri)
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
var i = value.IndexOf (':');
|
|
|
|
|
var host = i > 0 ? value.Substring (0, i) : value;
|
|
|
|
|
var type = Uri.CheckHostName (host);
|
|
|
|
|
|
|
|
|
|
return type != UriHostNameType.Dns ||
|
|
|
|
|
Uri.CheckHostName (_uri.DnsSafeHost) != UriHostNameType.Dns ||
|
|
|
|
|
host == _uri.DnsSafeHost;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Internal Methods
|
|
|
|
|
@ -1367,9 +1301,7 @@ namespace WebSocketSharp {
|
|
|
|
|
internal void Close (HttpStatusCode code)
|
|
|
|
|
{
|
|
|
|
|
_readyState = WsState.CLOSING;
|
|
|
|
|
send (createHandshakeResponse (code));
|
|
|
|
|
closeResources ();
|
|
|
|
|
_readyState = WsState.CLOSED;
|
|
|
|
|
close (code);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
@ -1469,13 +1401,11 @@ namespace WebSocketSharp {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
try {
|
|
|
|
|
if (connect ())
|
|
|
|
|
open ();
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
catch (Exception ex) {
|
|
|
|
|
_logger.Fatal (ex.Message);
|
|
|
|
|
var msg = "An exception has occured.";
|
|
|
|
|
error (msg);
|
|
|
|
|
|