[Fix] Cancel timeout process
This commit is contained in:
parent
02af0789e1
commit
ae4d764355
@ -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;
|
||||||
@ -59,28 +60,27 @@ namespace WebSocketSharp.Net
|
|||||||
{
|
{
|
||||||
#region Private Fields
|
#region Private Fields
|
||||||
|
|
||||||
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 HttpListener _lastListener;
|
||||||
private volatile bool _inTimeout;
|
private LineState _lineState;
|
||||||
private HttpListener _lastListener;
|
private EndPointListener _listener;
|
||||||
private LineState _lineState;
|
private ResponseStream _outputStream;
|
||||||
private EndPointListener _listener;
|
private int _position;
|
||||||
private ResponseStream _outputStream;
|
private MemoryStream _requestBuffer;
|
||||||
private int _position;
|
private int _reuses;
|
||||||
private MemoryStream _requestBuffer;
|
private bool _secure;
|
||||||
private int _reuses;
|
private Socket _socket;
|
||||||
private bool _secure;
|
private Stream _stream;
|
||||||
private Socket _socket;
|
private object _sync;
|
||||||
private Stream _stream;
|
private int _timeout;
|
||||||
private object _sync;
|
private Dictionary<int, bool> _timeoutCanceled;
|
||||||
private int _timeout;
|
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 {
|
||||||
conn._timer.Change (Timeout.Infinite, Timeout.Infinite);
|
var current = conn._reuses;
|
||||||
|
if (!conn._timeoutCanceled[current]) {
|
||||||
|
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);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user