Modified closing

This commit is contained in:
sta 2014-01-08 14:45:50 +09:00
parent e03f9eb631
commit 18cedc1018

View File

@ -555,6 +555,17 @@ namespace WebSocketSharp
: null; : null;
} }
private void close (CloseEventArgs args)
{
try {
OnClose.Emit (this, args);
}
catch (Exception ex) {
_logger.Fatal (ex.ToString ());
error ("An exception has occurred while OnClose.");
}
}
private void close (CloseStatusCode code, string reason, bool wait) private void close (CloseStatusCode code, string reason, bool wait)
{ {
close ( close (
@ -576,10 +587,10 @@ namespace WebSocketSharp
_readyState = WebSocketState.CLOSING; _readyState = WebSocketState.CLOSING;
} }
_logger.Trace ("Start closing handshake."); var args = new CloseEventArgs (payload);
try { try {
var args = new CloseEventArgs (payload); _logger.Trace ("Start closing handshake.");
args.WasClean = args.WasClean =
_client _client
? close ( ? close (
@ -593,77 +604,66 @@ namespace WebSocketSharp
wait ? 1000 : 0, wait ? 1000 : 0,
closeServerResources); closeServerResources);
_readyState = WebSocketState.CLOSED; _logger.Trace ("End closing handshake.");
OnClose.Emit (this, args);
} }
catch (Exception ex) { catch (Exception ex) {
_logger.Fatal (ex.ToString ()); _logger.Fatal (ex.ToString ());
error ("An exception has occurred while closing."); error ("An exception has occurred while closing.");
} }
_logger.Trace ("End closing handshake."); _readyState = WebSocketState.CLOSED;
close (args);
} }
private bool close (byte [] frameAsBytes, int timeOut, Func<bool> release) private bool close (byte [] frameAsBytes, int timeOut, Action release)
{ {
var sent = frameAsBytes != null && _stream.Write (frameAsBytes); var sent = frameAsBytes != null && _stream.Write (frameAsBytes);
var received = timeOut == 0 || var received = timeOut == 0 ||
(sent && _exitReceiving != null && _exitReceiving.WaitOne (timeOut)); (sent && _exitReceiving != null && _exitReceiving.WaitOne (timeOut));
var released = release ();
var result = sent && received && released; release ();
if (_receivePong != null) {
_receivePong.Close ();
_receivePong = null;
}
if (_exitReceiving != null) {
_exitReceiving.Close ();
_exitReceiving = null;
}
var result = sent && received;
_logger.Debug ( _logger.Debug (
String.Format ( String.Format (
"Was clean?: {0}\nsent: {1} received: {2} released: {3}", "Was clean?: {0}\nsent: {1} received: {2}", result, sent, received));
result,
sent,
received,
released));
return result; return result;
} }
// As client // As client
private bool closeClientResources () private void closeClientResources ()
{ {
try { if (_stream != null) {
if (_stream != null) { _stream.Dispose ();
_stream.Dispose (); _stream = null;
_stream = null;
}
if (_tcpClient != null) {
_tcpClient.Close ();
_tcpClient = null;
}
return true;
}
catch (Exception ex) {
_logger.Fatal (ex.ToString ());
error ("An exception has occurred while releasing resources.");
} }
return false; if (_tcpClient != null) {
_tcpClient.Close ();
_tcpClient = null;
}
} }
// As server // As server
private bool closeServerResources () private void closeServerResources ()
{ {
try { if (_closeContext == null)
if (_closeContext != null) return;
_closeContext ();
_stream = null; _closeContext ();
_context = null; _closeContext = null;
_stream = null;
return true; _context = null;
}
catch (Exception ex) {
_logger.Fatal (ex.ToString ());
error ("An exception has occurred while releasing resources.");
}
return false;
} }
private bool concatenateFragmentsInto (Stream dest) private bool concatenateFragmentsInto (Stream dest)
@ -1397,12 +1397,13 @@ namespace WebSocketSharp
try { try {
args.WasClean = close (frameAsBytes, waitTimeOut, closeServerResources); args.WasClean = close (frameAsBytes, waitTimeOut, closeServerResources);
_readyState = WebSocketState.CLOSED;
OnClose.Emit (this, args);
} }
catch (Exception ex) { catch (Exception ex) {
_logger.Fatal (ex.ToString ()); _logger.Fatal (ex.ToString ());
} }
_readyState = WebSocketState.CLOSED;
close (args);
} }
// As server // As server