From 6d987ed02587c0e25874f5f406db14e392a55b7d Mon Sep 17 00:00:00 2001 From: sta Date: Mon, 28 Apr 2014 17:47:32 +0900 Subject: [PATCH] Fix for issue #40 --- websocket-sharp/Net/HttpConnection.cs | 36 ++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/websocket-sharp/Net/HttpConnection.cs b/websocket-sharp/Net/HttpConnection.cs index 218d34eb..a1886568 100644 --- a/websocket-sharp/Net/HttpConnection.cs +++ b/websocket-sharp/Net/HttpConnection.cs @@ -178,6 +178,24 @@ namespace WebSocketSharp.Net removeConnection (); } + private void disposeTimer () + { + if (_timer == null) + return; + + var timer = _timer; + _timer = null; + + try { + timer.Change (Timeout.Infinite, Timeout.Infinite); + } + catch { + } + + if (timer != null) + timer.Dispose (); + } + private void init () { _chunked = false; @@ -194,10 +212,10 @@ namespace WebSocketSharp.Net private static void onRead (IAsyncResult asyncResult) { var conn = (HttpConnection) asyncResult.AsyncState; - conn._timer.Change (Timeout.Infinite, Timeout.Infinite); var read = -1; try { + conn._timer.Change (Timeout.Infinite, Timeout.Infinite); read = conn._stream.EndRead (asyncResult); conn._requestBuffer.Write (conn._buffer, 0, read); if (conn._requestBuffer.Length > 32768) { @@ -212,6 +230,7 @@ namespace WebSocketSharp.Net conn.SendError (); if (conn._socket != null) { + conn.disposeTimer (); conn.closeSocket (); conn.unbind (); } @@ -220,6 +239,7 @@ namespace WebSocketSharp.Net } if (read <= 0) { + conn.disposeTimer (); conn.closeSocket (); conn.unbind (); @@ -263,6 +283,7 @@ namespace WebSocketSharp.Net private static void onTimeout (object state) { var conn = (HttpConnection) state; + conn.disposeTimer (); conn.closeSocket (); conn.unbind (); } @@ -369,6 +390,7 @@ namespace WebSocketSharp.Net var req = _context.Request; var res = _context.Response; + force |= !req.KeepAlive; if (!force) force = res.Headers ["Connection"] == "close"; @@ -387,15 +409,17 @@ namespace WebSocketSharp.Net var socket = _socket; _socket = null; + + disposeTimer (); + try { socket.Shutdown (SocketShutdown.Both); } catch { } - finally { - if (socket != null) - socket.Close (); - } + + if (socket != null) + socket.Close (); unbind (); removeConnection (); @@ -421,7 +445,7 @@ namespace WebSocketSharp.Net _stream.BeginRead (_buffer, 0, _bufferSize, onRead, this); } catch { - _timer.Change (Timeout.Infinite, Timeout.Infinite); + disposeTimer (); closeSocket (); unbind (); }