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