Modified closing handshake
This commit is contained in:
parent
4375a5c2a3
commit
68d1a7b9ba
@ -29,15 +29,15 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
|
||||||
namespace WebSocketSharp {
|
namespace WebSocketSharp
|
||||||
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Contains the event data associated with a <see cref="WebSocket.OnClose"/> event.
|
/// Contains the event data associated with a <see cref="WebSocket.OnClose"/> event.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>
|
/// <remarks>
|
||||||
/// The <see cref="WebSocket.OnClose"/> event occurs when the WebSocket receives a close control frame or
|
/// A <see cref="WebSocket.OnClose"/> event occurs when the WebSocket connection has been closed.
|
||||||
/// the <c>WebSocket.Close</c> method is called. If you want to get the reason for closure, you should access
|
/// If you want to get the reason for closure, you use the <see cref="CloseEventArgs.Code"/> or
|
||||||
/// the <see cref="CloseEventArgs.Code"/> or <see cref="CloseEventArgs.Reason"/> properties.
|
/// <see cref="CloseEventArgs.Reason"/> property.
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public class CloseEventArgs : MessageEventArgs
|
public class CloseEventArgs : MessageEventArgs
|
||||||
{
|
{
|
||||||
@ -51,12 +51,12 @@ namespace WebSocketSharp {
|
|||||||
|
|
||||||
#region Constructors
|
#region Constructors
|
||||||
|
|
||||||
internal CloseEventArgs(PayloadData data)
|
internal CloseEventArgs (PayloadData data)
|
||||||
: base(Opcode.CLOSE, data)
|
: base (Opcode.CLOSE, data)
|
||||||
{
|
{
|
||||||
_code = getCodeFrom(data);
|
_code = getCodeFrom (data);
|
||||||
_reason = getReasonFrom(data);
|
_reason = getReasonFrom (data);
|
||||||
_clean = false;
|
_clean = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
@ -67,7 +67,7 @@ namespace WebSocketSharp {
|
|||||||
/// Gets the status code for closure.
|
/// Gets the status code for closure.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <value>
|
/// <value>
|
||||||
/// A <see cref="ushort"/> that contains a status code for closure.
|
/// A <see cref="ushort"/> that contains a status code for closure if any.
|
||||||
/// </value>
|
/// </value>
|
||||||
public ushort Code {
|
public ushort Code {
|
||||||
get {
|
get {
|
||||||
@ -79,7 +79,7 @@ namespace WebSocketSharp {
|
|||||||
/// Gets the reason for closure.
|
/// Gets the reason for closure.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <value>
|
/// <value>
|
||||||
/// A <see cref="string"/> that contains a reason for closure.
|
/// A <see cref="string"/> that contains the reason for closure if any.
|
||||||
/// </value>
|
/// </value>
|
||||||
public string Reason {
|
public string Reason {
|
||||||
get {
|
get {
|
||||||
@ -88,10 +88,10 @@ namespace WebSocketSharp {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates whether the WebSocket connection closed cleanly.
|
/// Indicates whether the WebSocket connection has been closed cleanly.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <value>
|
/// <value>
|
||||||
/// <c>true</c> if the WebSocket connection closed cleanly; otherwise, <c>false</c>.
|
/// <c>true</c> if the WebSocket connection has been closed cleanly; otherwise, <c>false</c>.
|
||||||
/// </value>
|
/// </value>
|
||||||
public bool WasClean {
|
public bool WasClean {
|
||||||
get {
|
get {
|
||||||
@ -107,23 +107,23 @@ namespace WebSocketSharp {
|
|||||||
|
|
||||||
#region Private Methods
|
#region Private Methods
|
||||||
|
|
||||||
private static ushort getCodeFrom(PayloadData data)
|
private static ushort getCodeFrom (PayloadData data)
|
||||||
{
|
{
|
||||||
var appData = data.ApplicationData;
|
var appData = data.ApplicationData;
|
||||||
return appData.Length >= 2
|
return appData.Length >= 2
|
||||||
? appData.SubArray(0, 2).To<ushort>(ByteOrder.BIG)
|
? appData.SubArray (0, 2).To<ushort> (ByteOrder.BIG)
|
||||||
: (ushort)CloseStatusCode.NO_STATUS_CODE;
|
: (ushort) CloseStatusCode.NO_STATUS_CODE;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static string getReasonFrom(PayloadData data)
|
private static string getReasonFrom (PayloadData data)
|
||||||
{
|
{
|
||||||
var appData = data.ApplicationData;
|
var appData = data.ApplicationData;
|
||||||
var appDataLen = appData.Length;
|
var appDataLen = appData.Length;
|
||||||
if (appDataLen <= 2)
|
if (appDataLen <= 2)
|
||||||
return String.Empty;
|
return String.Empty;
|
||||||
|
|
||||||
var buffer = appData.SubArray(2, appDataLen - 2);
|
var reason = appData.SubArray (2, appDataLen - 2);
|
||||||
return Encoding.UTF8.GetString(buffer);
|
return Encoding.UTF8.GetString (reason);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
@ -473,7 +473,7 @@ namespace WebSocketSharp {
|
|||||||
#region Public Events
|
#region Public Events
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Occurs when the <see cref="WebSocket"/> receives a Close frame or the Close method is called.
|
/// Occurs when the WebSocket connection has been closed.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public event EventHandler<CloseEventArgs> OnClose;
|
public event EventHandler<CloseEventArgs> OnClose;
|
||||||
|
|
||||||
@ -497,136 +497,109 @@ namespace WebSocketSharp {
|
|||||||
#region Private Methods
|
#region Private Methods
|
||||||
|
|
||||||
// As server
|
// As server
|
||||||
private bool acceptHandshake()
|
private bool acceptHandshake ()
|
||||||
{
|
{
|
||||||
if (!processRequestHandshake())
|
return processRequestHandshake ()
|
||||||
return false;
|
? send (createResponseHandshake ())
|
||||||
|
: false;
|
||||||
sendResponseHandshake();
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void close(CloseEventArgs eventArgs)
|
private void close (CloseEventArgs eventArgs)
|
||||||
{
|
{
|
||||||
if (!Thread.CurrentThread.IsBackground && _exitReceiving != null)
|
if (!Thread.CurrentThread.IsBackground && _exitReceiving != null)
|
||||||
_exitReceiving.WaitOne(5 * 1000);
|
if (!_exitReceiving.WaitOne (5 * 1000))
|
||||||
|
eventArgs.WasClean = false;
|
||||||
|
|
||||||
if (!closeResources())
|
if (!closeResources ())
|
||||||
eventArgs.WasClean = false;
|
eventArgs.WasClean = false;
|
||||||
|
|
||||||
OnClose.Emit(this, eventArgs);
|
_readyState = WsState.CLOSED;
|
||||||
|
OnClose.Emit (this, eventArgs);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void close(PayloadData data)
|
private void close (PayloadData data)
|
||||||
{
|
{
|
||||||
_logger.Debug("Is this thread background?: " + Thread.CurrentThread.IsBackground);
|
_logger.Debug ("Is this thread background?: " + Thread.CurrentThread.IsBackground);
|
||||||
lock(_forClose)
|
CloseEventArgs args = null;
|
||||||
|
lock (_forClose)
|
||||||
{
|
{
|
||||||
// Whether the closing handshake has been started already?
|
|
||||||
if (_readyState == WsState.CLOSING || _readyState == WsState.CLOSED)
|
if (_readyState == WsState.CLOSING || _readyState == WsState.CLOSED)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Whether the closing handshake on server is started before the connection has been established?
|
var state = _readyState;
|
||||||
if (_readyState == WsState.CONNECTING && !_client)
|
|
||||||
{
|
|
||||||
sendResponseHandshake(HttpStatusCode.BadRequest);
|
|
||||||
close(new CloseEventArgs(data));
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
_readyState = WsState.CLOSING;
|
_readyState = WsState.CLOSING;
|
||||||
|
args = new CloseEventArgs (data);
|
||||||
|
if (state == WsState.CONNECTING)
|
||||||
|
{
|
||||||
|
if (!_client)
|
||||||
|
args.WasClean = send (createResponseHandshake (HttpStatusCode.BadRequest));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!data.ContainsReservedCloseStatusCode)
|
||||||
|
args.WasClean = send (createControlFrame (Opcode.CLOSE, data, _client));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Whether a payload data contains the close status code which must not be set for send?
|
close (args);
|
||||||
if (data.ContainsReservedCloseStatusCode)
|
_logger.Trace ("Exit close method.");
|
||||||
{
|
|
||||||
close(new CloseEventArgs(data));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
closeHandshake(data);
|
|
||||||
_logger.Trace("Exit close method.");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void close(HttpStatusCode code)
|
private void close (ushort code, string reason)
|
||||||
{
|
{
|
||||||
if (_readyState != WsState.CONNECTING || _client)
|
var data = code.Append (reason);
|
||||||
return;
|
|
||||||
|
|
||||||
sendResponseHandshake(code);
|
|
||||||
closeResources();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void close(ushort code, string reason)
|
|
||||||
{
|
|
||||||
var data = code.Append(reason);
|
|
||||||
if (data.Length > 125)
|
if (data.Length > 125)
|
||||||
{
|
{
|
||||||
var msg = "The payload length of a Close frame must be 125 bytes or less.";
|
var msg = "The payload length of a Close frame must be 125 bytes or less.";
|
||||||
_logger.Error(msg);
|
_logger.Error (msg);
|
||||||
error(msg);
|
error (msg);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
close(new PayloadData(data));
|
close (new PayloadData (data));
|
||||||
}
|
|
||||||
|
|
||||||
private void closeHandshake(PayloadData data)
|
|
||||||
{
|
|
||||||
var args = new CloseEventArgs(data);
|
|
||||||
var frame = createControlFrame(Opcode.CLOSE, data, _client);
|
|
||||||
if (send(frame))
|
|
||||||
args.WasClean = true;
|
|
||||||
|
|
||||||
close(args);
|
|
||||||
}
|
|
||||||
|
|
||||||
private bool closeResources()
|
|
||||||
{
|
|
||||||
_readyState = WsState.CLOSED;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (_client)
|
|
||||||
closeResourcesAsClient();
|
|
||||||
else
|
|
||||||
closeResourcesAsServer();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
_logger.Fatal(ex.Message);
|
|
||||||
error("An exception has occured.");
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// As client
|
// As client
|
||||||
private void closeResourcesAsClient()
|
private void closeClientResources ()
|
||||||
{
|
{
|
||||||
if (_stream != null)
|
if (_stream != null)
|
||||||
{
|
{
|
||||||
_stream.Dispose();
|
_stream.Dispose ();
|
||||||
_stream = null;
|
_stream = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_tcpClient != null)
|
if (_tcpClient != null)
|
||||||
{
|
{
|
||||||
_tcpClient.Close();
|
_tcpClient.Close ();
|
||||||
_tcpClient = null;
|
_tcpClient = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private bool closeResources ()
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
if (_client)
|
||||||
|
closeClientResources ();
|
||||||
|
else
|
||||||
|
closeServerResources ();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch (Exception ex) {
|
||||||
|
_logger.Fatal (ex.Message);
|
||||||
|
error ("An exception has occured.");
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// As server
|
// As server
|
||||||
private void closeResourcesAsServer()
|
private void closeServerResources ()
|
||||||
{
|
{
|
||||||
if (_context != null && _closeContext != null)
|
if (_context != null && _closeContext != null)
|
||||||
{
|
{
|
||||||
_closeContext();
|
_closeContext ();
|
||||||
_stream = null;
|
_stream = null;
|
||||||
_context = null;
|
_context = null;
|
||||||
}
|
}
|
||||||
@ -1080,34 +1053,31 @@ namespace WebSocketSharp {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// As server
|
// As server
|
||||||
private bool processRequestHandshake()
|
private bool processRequestHandshake ()
|
||||||
{
|
{
|
||||||
var req = RequestHandshake.Parse(_context);
|
var req = RequestHandshake.Parse (_context);
|
||||||
_logger.Debug("Request handshake from client:\n" + req.ToString());
|
_logger.Debug ("Request handshake from client:\n" + req.ToString ());
|
||||||
if (!isValidRequesHandshake())
|
if (!isValidRequesHandshake ())
|
||||||
{
|
{
|
||||||
var msg = "Invalid WebSocket connection request.";
|
var msg = "Invalid WebSocket connection request.";
|
||||||
_logger.Error(msg);
|
_logger.Error (msg);
|
||||||
error(msg);
|
error (msg);
|
||||||
close(HttpStatusCode.BadRequest);
|
Close (HttpStatusCode.BadRequest);
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
_base64key = _context.SecWebSocketKey;
|
_base64key = _context.SecWebSocketKey;
|
||||||
processRequestProtocols(_context.Headers["Sec-WebSocket-Protocol"]);
|
|
||||||
processRequestExtensions(_context.Headers["Sec-WebSocket-Extensions"]);
|
var protocols = _context.Headers ["Sec-WebSocket-Protocol"];
|
||||||
|
if (!protocols.IsNullOrEmpty ())
|
||||||
|
_protocols = protocols;
|
||||||
|
|
||||||
|
processRequestExtensions (_context.Headers ["Sec-WebSocket-Extensions"]);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// As server
|
|
||||||
private void processRequestProtocols(string protocols)
|
|
||||||
{
|
|
||||||
if (!protocols.IsNullOrEmpty())
|
|
||||||
_protocols = protocols;
|
|
||||||
}
|
|
||||||
|
|
||||||
// As client
|
// As client
|
||||||
private void processResponseCookies(CookieCollection cookies)
|
private void processResponseCookies(CookieCollection cookies)
|
||||||
{
|
{
|
||||||
@ -1190,13 +1160,13 @@ namespace WebSocketSharp {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// As server
|
// As server
|
||||||
private void send(ResponseHandshake response)
|
private bool send (ResponseHandshake response)
|
||||||
{
|
{
|
||||||
_logger.Debug("Response handshake to client:\n" + response.ToString());
|
_logger.Debug ("Response handshake to client:\n" + response.ToString ());
|
||||||
_stream.WriteHandshake(response);
|
return _stream.WriteHandshake (response);
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool send(WsFrame frame)
|
private bool send (WsFrame frame)
|
||||||
{
|
{
|
||||||
lock (_forFrame)
|
lock (_forFrame)
|
||||||
{
|
{
|
||||||
@ -1211,13 +1181,13 @@ namespace WebSocketSharp {
|
|||||||
if (!ready)
|
if (!ready)
|
||||||
{
|
{
|
||||||
var msg = "The WebSocket connection isn't established or has been closed.";
|
var msg = "The WebSocket connection isn't established or has been closed.";
|
||||||
_logger.Error(msg);
|
_logger.Error (msg);
|
||||||
error(msg);
|
error (msg);
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return _stream.WriteFrame(frame);
|
return _stream.WriteFrame (frame);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1346,24 +1316,10 @@ namespace WebSocketSharp {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// As client
|
// As client
|
||||||
private ResponseHandshake sendRequestHandshake(RequestHandshake request)
|
private ResponseHandshake sendRequestHandshake (RequestHandshake request)
|
||||||
{
|
{
|
||||||
send(request);
|
send (request);
|
||||||
return receiveResponseHandshake();
|
return receiveResponseHandshake ();
|
||||||
}
|
|
||||||
|
|
||||||
// As server
|
|
||||||
private void sendResponseHandshake()
|
|
||||||
{
|
|
||||||
var res = createResponseHandshake();
|
|
||||||
send(res);
|
|
||||||
}
|
|
||||||
|
|
||||||
// As server
|
|
||||||
private void sendResponseHandshake(HttpStatusCode code)
|
|
||||||
{
|
|
||||||
var res = createResponseHandshake(code);
|
|
||||||
send(res);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// As client
|
// As client
|
||||||
@ -1375,35 +1331,32 @@ namespace WebSocketSharp {
|
|||||||
_stream = WsStream.CreateClientStream(_tcpClient, _secure, host, _certValidationCallback);
|
_stream = WsStream.CreateClientStream(_tcpClient, _secure, host, _certValidationCallback);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void startReceiving()
|
private void startReceiving ()
|
||||||
{
|
{
|
||||||
_exitReceiving = new AutoResetEvent(false);
|
_exitReceiving = new AutoResetEvent (false);
|
||||||
_receivePong = new AutoResetEvent(false);
|
_receivePong = new AutoResetEvent (false);
|
||||||
|
|
||||||
Action<WsFrame> completed = null;
|
Action<WsFrame> completed = null;
|
||||||
completed = (frame) =>
|
completed = frame =>
|
||||||
{
|
{
|
||||||
try
|
try {
|
||||||
{
|
processFrame (frame);
|
||||||
processFrame(frame);
|
|
||||||
if (_readyState == WsState.OPEN)
|
if (_readyState == WsState.OPEN)
|
||||||
_stream.ReadFrameAsync(completed);
|
_stream.ReadFrameAsync (completed);
|
||||||
else
|
else
|
||||||
_exitReceiving.Set();
|
_exitReceiving.Set ();
|
||||||
}
|
}
|
||||||
catch (WebSocketException ex)
|
catch (WebSocketException ex) {
|
||||||
{
|
_logger.Fatal (ex.Message);
|
||||||
_logger.Fatal(ex.Message);
|
Close (ex.Code, ex.Message);
|
||||||
Close(ex.Code, ex.Message);
|
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex) {
|
||||||
{
|
_logger.Fatal (ex.Message);
|
||||||
_logger.Fatal(ex.Message);
|
Close (CloseStatusCode.ABNORMAL, "An exception has occured.");
|
||||||
Close(CloseStatusCode.ABNORMAL, "An exception has occured.");
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
_stream.ReadFrameAsync(completed);
|
_stream.ReadFrameAsync (completed);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
@ -1411,9 +1364,12 @@ namespace WebSocketSharp {
|
|||||||
#region Internal Methods
|
#region Internal Methods
|
||||||
|
|
||||||
// As server
|
// As server
|
||||||
internal void Close(HttpStatusCode code)
|
internal void Close (HttpStatusCode code)
|
||||||
{
|
{
|
||||||
close(code);
|
_readyState = WsState.CLOSING;
|
||||||
|
send (createResponseHandshake (code));
|
||||||
|
closeResources ();
|
||||||
|
_readyState = WsState.CLOSED;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
@ -1423,9 +1379,9 @@ namespace WebSocketSharp {
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Closes the WebSocket connection and releases all associated resources.
|
/// Closes the WebSocket connection and releases all associated resources.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void Close()
|
public void Close ()
|
||||||
{
|
{
|
||||||
close(new PayloadData());
|
close (new PayloadData ());
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -1439,9 +1395,9 @@ namespace WebSocketSharp {
|
|||||||
/// <param name="code">
|
/// <param name="code">
|
||||||
/// A <see cref="ushort"/> that indicates the status code for closure.
|
/// A <see cref="ushort"/> that indicates the status code for closure.
|
||||||
/// </param>
|
/// </param>
|
||||||
public void Close(ushort code)
|
public void Close (ushort code)
|
||||||
{
|
{
|
||||||
Close(code, String.Empty);
|
Close (code, String.Empty);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -1451,9 +1407,9 @@ namespace WebSocketSharp {
|
|||||||
/// <param name="code">
|
/// <param name="code">
|
||||||
/// One of the <see cref="CloseStatusCode"/> values that indicates the status code for closure.
|
/// One of the <see cref="CloseStatusCode"/> values that indicates the status code for closure.
|
||||||
/// </param>
|
/// </param>
|
||||||
public void Close(CloseStatusCode code)
|
public void Close (CloseStatusCode code)
|
||||||
{
|
{
|
||||||
close((ushort)code, String.Empty);
|
close ((ushort) code, String.Empty);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -1470,18 +1426,18 @@ namespace WebSocketSharp {
|
|||||||
/// <param name="reason">
|
/// <param name="reason">
|
||||||
/// A <see cref="string"/> that contains the reason for closure.
|
/// A <see cref="string"/> that contains the reason for closure.
|
||||||
/// </param>
|
/// </param>
|
||||||
public void Close(ushort code, string reason)
|
public void Close (ushort code, string reason)
|
||||||
{
|
{
|
||||||
if (!code.IsCloseStatusCode())
|
if (!code.IsCloseStatusCode ())
|
||||||
{
|
{
|
||||||
var msg = String.Format("Invalid close status code: {0}", code);
|
var msg = String.Format ("Invalid close status code: {0}", code);
|
||||||
_logger.Error(msg);
|
_logger.Error (msg);
|
||||||
error(msg);
|
error (msg);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
close(code, reason);
|
close (code, reason);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -1494,9 +1450,9 @@ namespace WebSocketSharp {
|
|||||||
/// <param name="reason">
|
/// <param name="reason">
|
||||||
/// A <see cref="string"/> that contains the reason for closure.
|
/// A <see cref="string"/> that contains the reason for closure.
|
||||||
/// </param>
|
/// </param>
|
||||||
public void Close(CloseStatusCode code, string reason)
|
public void Close (CloseStatusCode code, string reason)
|
||||||
{
|
{
|
||||||
close((ushort)code, reason);
|
close ((ushort) code, reason);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
Loading…
Reference in New Issue
Block a user