[Fix] Cancel timeout process

This commit is contained in:
sta 2016-07-22 17:32:11 +09:00
parent 02af0789e1
commit ae4d764355

View File

@ -46,6 +46,7 @@
#endregion #endregion
using System; using System;
using System.Collections.Generic;
using System.IO; using System.IO;
using System.Net; using System.Net;
using System.Net.Security; using System.Net.Security;
@ -61,13 +62,11 @@ namespace WebSocketSharp.Net
private byte[] _buffer; private byte[] _buffer;
private const int _bufferLength = 8192; private const int _bufferLength = 8192;
private volatile bool _cancelTimeout;
private HttpListenerContext _context; private HttpListenerContext _context;
private bool _contextRegistered; private bool _contextRegistered;
private StringBuilder _currentLine; private StringBuilder _currentLine;
private InputState _inputState; private InputState _inputState;
private RequestStream _inputStream; private RequestStream _inputStream;
private volatile bool _inTimeout;
private HttpListener _lastListener; private HttpListener _lastListener;
private LineState _lineState; private LineState _lineState;
private EndPointListener _listener; private EndPointListener _listener;
@ -80,6 +79,7 @@ namespace WebSocketSharp.Net
private Stream _stream; private Stream _stream;
private object _sync; private object _sync;
private int _timeout; private int _timeout;
private Dictionary<int, bool> _timeoutCanceled;
private Timer _timer; private Timer _timer;
#endregion #endregion
@ -111,6 +111,7 @@ namespace WebSocketSharp.Net
_sync = new object (); _sync = new object ();
_timeout = 90000; // 90k ms for first request, 15k ms from then on. _timeout = 90000; // 90k ms for first request, 15k ms from then on.
_timeoutCanceled = new Dictionary<int, bool> ();
_timer = new Timer (onTimeout, this, Timeout.Infinite, Timeout.Infinite); _timer = new Timer (onTimeout, this, Timeout.Infinite, Timeout.Infinite);
init (); init ();
@ -248,7 +249,12 @@ namespace WebSocketSharp.Net
var nread = -1; var nread = -1;
var len = 0; var len = 0;
try { try {
var current = conn._reuses;
if (!conn._timeoutCanceled[current]) {
conn._timer.Change (Timeout.Infinite, Timeout.Infinite); conn._timer.Change (Timeout.Infinite, Timeout.Infinite);
conn._timeoutCanceled[current] = true;
}
nread = conn._stream.EndRead (asyncResult); nread = conn._stream.EndRead (asyncResult);
conn._requestBuffer.Write (conn._buffer, 0, nread); conn._requestBuffer.Write (conn._buffer, 0, nread);
len = (int) conn._requestBuffer.Length; len = (int) conn._requestBuffer.Length;
@ -293,9 +299,6 @@ namespace WebSocketSharp.Net
conn._lastListener = lsnr; conn._lastListener = lsnr;
} }
if (conn._inTimeout)
conn._cancelTimeout = true;
conn._context.Listener = lsnr; conn._context.Listener = lsnr;
if (!conn._context.Authenticate ()) if (!conn._context.Authenticate ())
return; return;
@ -306,9 +309,6 @@ namespace WebSocketSharp.Net
return; return;
} }
if (conn._inTimeout)
conn._cancelTimeout = true;
conn._stream.BeginRead (conn._buffer, 0, _bufferLength, onRead, conn); conn._stream.BeginRead (conn._buffer, 0, _bufferLength, onRead, conn);
} }
} }
@ -316,28 +316,18 @@ namespace WebSocketSharp.Net
private static void onTimeout (object state) private static void onTimeout (object state)
{ {
var conn = (HttpConnection) state; var conn = (HttpConnection) state;
var current = conn._reuses;
conn._inTimeout = true; if (conn._socket == null)
if (conn._socket == null) {
conn._inTimeout = false;
return; return;
}
lock (conn._sync) { lock (conn._sync) {
if (conn._socket == null) { if (conn._socket == null)
conn._inTimeout = false;
return; return;
}
if (conn._cancelTimeout) {
conn._cancelTimeout = false;
conn._inTimeout = false;
if (conn._timeoutCanceled[current])
return; return;
}
conn.SendError (null, 408); conn.SendError (null, 408);
conn._inTimeout = false;
} }
} }
@ -481,6 +471,7 @@ namespace WebSocketSharp.Net
_timeout = 15000; _timeout = 15000;
try { try {
_timeoutCanceled.Add (_reuses, false);
_timer.Change (_timeout, Timeout.Infinite); _timer.Change (_timeout, Timeout.Infinite);
_stream.BeginRead (_buffer, 0, _bufferLength, onRead, this); _stream.BeginRead (_buffer, 0, _bufferLength, onRead, this);
} }