From 2bc95c251f64cd4f3e6f375e848566796e038049 Mon Sep 17 00:00:00 2001 From: sta Date: Wed, 20 Jul 2016 17:24:23 +0900 Subject: [PATCH] [Fix] Cancel timeout process --- websocket-sharp/Net/HttpConnection.cs | 32 ++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/websocket-sharp/Net/HttpConnection.cs b/websocket-sharp/Net/HttpConnection.cs index feb41139..0e30c1c7 100644 --- a/websocket-sharp/Net/HttpConnection.cs +++ b/websocket-sharp/Net/HttpConnection.cs @@ -61,11 +61,13 @@ namespace WebSocketSharp.Net private byte[] _buffer; private const int _bufferLength = 8192; + private volatile bool _cancelTimeout; private HttpListenerContext _context; private bool _contextRegistered; private StringBuilder _currentLine; private InputState _inputState; private RequestStream _inputStream; + private volatile bool _inTimeout; private HttpListener _lastListener; private LineState _lineState; private EndPointListener _listener; @@ -291,6 +293,9 @@ namespace WebSocketSharp.Net conn._lastListener = lsnr; } + if (conn._inTimeout) + conn._cancelTimeout = true; + conn._context.Listener = lsnr; if (!conn._context.Authenticate ()) return; @@ -301,6 +306,9 @@ namespace WebSocketSharp.Net return; } + if (conn._inTimeout) + conn._cancelTimeout = true; + conn._stream.BeginRead (conn._buffer, 0, _bufferLength, onRead, conn); } } @@ -308,7 +316,29 @@ namespace WebSocketSharp.Net private static void onTimeout (object state) { var conn = (HttpConnection) state; - conn.close (); + + conn._inTimeout = true; + if (conn._socket == null) { + conn._inTimeout = false; + return; + } + + lock (conn._sync) { + if (conn._socket == null) { + conn._inTimeout = false; + return; + } + + if (conn._cancelTimeout) { + conn._cancelTimeout = false; + conn._inTimeout = false; + + return; + } + + conn.SendError (null, 408); + conn._inTimeout = false; + } } // true -> Done processing.