Added internal 'wait time' for the ping and close
This commit is contained in:
@@ -424,7 +424,7 @@ namespace WebSocketSharp.Server
|
||||
_state = ServerState.ShuttingDown;
|
||||
}
|
||||
|
||||
_services.Stop (new CloseEventArgs (CloseStatusCode.ServerError), true);
|
||||
_services.Stop (new CloseEventArgs (CloseStatusCode.ServerError), true, false);
|
||||
_listener.Abort ();
|
||||
|
||||
_state = ServerState.Stop;
|
||||
@@ -696,7 +696,7 @@ namespace WebSocketSharp.Server
|
||||
_state = ServerState.ShuttingDown;
|
||||
}
|
||||
|
||||
_services.Stop (new CloseEventArgs (), true);
|
||||
_services.Stop (new CloseEventArgs (), true, true);
|
||||
stopReceiving (5000);
|
||||
|
||||
_state = ServerState.Stop;
|
||||
@@ -729,7 +729,9 @@ namespace WebSocketSharp.Server
|
||||
_state = ServerState.ShuttingDown;
|
||||
}
|
||||
|
||||
_services.Stop (e, !code.IsReserved ());
|
||||
var send = !code.IsReserved ();
|
||||
_services.Stop (e, send, send);
|
||||
|
||||
stopReceiving (5000);
|
||||
|
||||
_state = ServerState.Stop;
|
||||
@@ -762,7 +764,9 @@ namespace WebSocketSharp.Server
|
||||
_state = ServerState.ShuttingDown;
|
||||
}
|
||||
|
||||
_services.Stop (e, !code.IsReserved ());
|
||||
var send = !code.IsReserved ();
|
||||
_services.Stop (e, send, send);
|
||||
|
||||
stopReceiving (5000);
|
||||
|
||||
_state = ServerState.Stop;
|
||||
|
@@ -315,8 +315,9 @@ namespace WebSocketSharp.Server
|
||||
_sessions = sessions;
|
||||
|
||||
_websocket = context.WebSocket;
|
||||
_websocket.Protocol = _protocol;
|
||||
_websocket.CustomHandshakeRequestChecker = checkIfValidConnectionRequest;
|
||||
_websocket.Protocol = _protocol;
|
||||
_websocket.WaitTime = sessions.WaitTime;
|
||||
|
||||
_websocket.OnOpen += onOpen;
|
||||
_websocket.OnMessage += onMessage;
|
||||
|
@@ -507,7 +507,7 @@ namespace WebSocketSharp.Server
|
||||
}
|
||||
|
||||
_listener.Stop ();
|
||||
_services.Stop (new CloseEventArgs (CloseStatusCode.ServerError), true);
|
||||
_services.Stop (new CloseEventArgs (CloseStatusCode.ServerError), true, false);
|
||||
|
||||
_state = ServerState.Stop;
|
||||
}
|
||||
@@ -793,7 +793,7 @@ namespace WebSocketSharp.Server
|
||||
}
|
||||
|
||||
stopReceiving (5000);
|
||||
_services.Stop (new CloseEventArgs (), true);
|
||||
_services.Stop (new CloseEventArgs (), true, true);
|
||||
|
||||
_state = ServerState.Stop;
|
||||
}
|
||||
@@ -826,7 +826,9 @@ namespace WebSocketSharp.Server
|
||||
}
|
||||
|
||||
stopReceiving (5000);
|
||||
_services.Stop (e, !code.IsReserved ());
|
||||
|
||||
var send = !code.IsReserved ();
|
||||
_services.Stop (e, send, send);
|
||||
|
||||
_state = ServerState.Stop;
|
||||
}
|
||||
@@ -859,7 +861,9 @@ namespace WebSocketSharp.Server
|
||||
}
|
||||
|
||||
stopReceiving (5000);
|
||||
_services.Stop (e, !code.IsReserved ());
|
||||
|
||||
var send = !code.IsReserved ();
|
||||
_services.Stop (e, send, send);
|
||||
|
||||
_state = ServerState.Stop;
|
||||
}
|
||||
|
@@ -67,6 +67,16 @@ namespace WebSocketSharp.Server
|
||||
}
|
||||
}
|
||||
|
||||
internal TimeSpan WaitTime {
|
||||
get {
|
||||
return Sessions.WaitTime;
|
||||
}
|
||||
|
||||
set {
|
||||
Sessions.WaitTime = value;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Public Properties
|
||||
@@ -122,11 +132,13 @@ namespace WebSocketSharp.Server
|
||||
internal void Stop (ushort code, string reason)
|
||||
{
|
||||
var e = new CloseEventArgs (code, reason);
|
||||
var bytes = !code.IsReserved ()
|
||||
? WebSocketFrame.CreateCloseFrame (Mask.Unmask, e.PayloadData).ToByteArray ()
|
||||
: null;
|
||||
|
||||
Sessions.Stop (e, bytes);
|
||||
var send = !code.IsReserved ();
|
||||
var bytes =
|
||||
send ? WebSocketFrame.CreateCloseFrame (e.PayloadData, false).ToByteArray () : null;
|
||||
|
||||
var timeout = send ? WaitTime : TimeSpan.Zero;
|
||||
Sessions.Stop (e, bytes, timeout);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
@@ -49,6 +49,7 @@ namespace WebSocketSharp.Server
|
||||
private Logger _logger;
|
||||
private volatile ServerState _state;
|
||||
private object _sync;
|
||||
private TimeSpan _waitTime;
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -67,6 +68,28 @@ namespace WebSocketSharp.Server
|
||||
_hosts = new Dictionary<string, WebSocketServiceHost> ();
|
||||
_state = ServerState.Ready;
|
||||
_sync = ((ICollection) _hosts).SyncRoot;
|
||||
_waitTime = TimeSpan.FromSeconds (1);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Internal Properties
|
||||
|
||||
internal TimeSpan WaitTime {
|
||||
get {
|
||||
return _waitTime;
|
||||
}
|
||||
|
||||
set {
|
||||
lock (_sync) {
|
||||
if (value == _waitTime)
|
||||
return;
|
||||
|
||||
_waitTime = value;
|
||||
foreach (var host in _hosts.Values)
|
||||
host.WaitTime = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
@@ -240,14 +263,14 @@ namespace WebSocketSharp.Server
|
||||
}
|
||||
|
||||
private Dictionary<string, Dictionary<string, bool>> broadping (
|
||||
byte[] frameAsBytes, int millisecondsTimeout)
|
||||
byte[] frameAsBytes, TimeSpan timeout)
|
||||
{
|
||||
var res = new Dictionary<string, Dictionary<string, bool>> ();
|
||||
foreach (var host in Hosts) {
|
||||
if (_state != ServerState.Start)
|
||||
break;
|
||||
|
||||
res.Add (host.Path, host.Sessions.Broadping (frameAsBytes, millisecondsTimeout));
|
||||
res.Add (host.Path, host.Sessions.Broadping (frameAsBytes, timeout));
|
||||
}
|
||||
|
||||
return res;
|
||||
@@ -275,6 +298,9 @@ namespace WebSocketSharp.Server
|
||||
if (!_clean)
|
||||
host.KeepClean = false;
|
||||
|
||||
if (_waitTime != host.WaitTime)
|
||||
host.WaitTime = _waitTime;
|
||||
|
||||
if (_state == ServerState.Start)
|
||||
host.Start ();
|
||||
|
||||
@@ -325,16 +351,17 @@ namespace WebSocketSharp.Server
|
||||
}
|
||||
}
|
||||
|
||||
internal void Stop (CloseEventArgs e, bool send)
|
||||
internal void Stop (CloseEventArgs e, bool send, bool wait)
|
||||
{
|
||||
lock (_sync) {
|
||||
_state = ServerState.ShuttingDown;
|
||||
var bytes = send
|
||||
? WebSocketFrame.CreateCloseFrame (Mask.Unmask, e.PayloadData).ToByteArray ()
|
||||
: null;
|
||||
|
||||
var bytes =
|
||||
send ? WebSocketFrame.CreateCloseFrame (e.PayloadData, false).ToByteArray () : null;
|
||||
|
||||
var timeout = wait ? _waitTime : TimeSpan.Zero;
|
||||
foreach (var host in _hosts.Values)
|
||||
host.Sessions.Stop (e, bytes);
|
||||
host.Sessions.Stop (e, bytes, timeout);
|
||||
|
||||
_hosts.Clear ();
|
||||
_state = ServerState.Stop;
|
||||
@@ -512,7 +539,7 @@ namespace WebSocketSharp.Server
|
||||
return null;
|
||||
}
|
||||
|
||||
return broadping (WebSocketFrame.EmptyUnmaskPingData, 1000);
|
||||
return broadping (WebSocketFrame.EmptyUnmaskPingData, _waitTime);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -543,7 +570,7 @@ namespace WebSocketSharp.Server
|
||||
return null;
|
||||
}
|
||||
|
||||
return broadping (WebSocketFrame.CreatePingFrame (Mask.Unmask, data).ToByteArray (), 1000);
|
||||
return broadping (WebSocketFrame.CreatePingFrame (data, false).ToByteArray (), _waitTime);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@@ -51,6 +51,7 @@ namespace WebSocketSharp.Server
|
||||
private volatile bool _sweeping;
|
||||
private System.Timers.Timer _sweepTimer;
|
||||
private object _sync;
|
||||
private TimeSpan _waitTime;
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -70,6 +71,7 @@ namespace WebSocketSharp.Server
|
||||
_sessions = new Dictionary<string, IWebSocketSession> ();
|
||||
_state = ServerState.Ready;
|
||||
_sync = ((ICollection) _sessions).SyncRoot;
|
||||
_waitTime = TimeSpan.FromSeconds (1);
|
||||
|
||||
setSweepTimer (60000);
|
||||
}
|
||||
@@ -84,6 +86,21 @@ namespace WebSocketSharp.Server
|
||||
}
|
||||
}
|
||||
|
||||
internal TimeSpan WaitTime {
|
||||
get {
|
||||
return _waitTime;
|
||||
}
|
||||
|
||||
set {
|
||||
if (value == _waitTime)
|
||||
return;
|
||||
|
||||
_waitTime = value;
|
||||
foreach (var session in Sessions)
|
||||
session.Context.WebSocket.WaitTime = value;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Public Properties
|
||||
@@ -97,7 +114,7 @@ namespace WebSocketSharp.Server
|
||||
/// </value>
|
||||
public IEnumerable<string> ActiveIDs {
|
||||
get {
|
||||
foreach (var res in Broadping (WebSocketFrame.EmptyUnmaskPingData, 1000))
|
||||
foreach (var res in Broadping (WebSocketFrame.EmptyUnmaskPingData, _waitTime))
|
||||
if (res.Value)
|
||||
yield return res.Key;
|
||||
}
|
||||
@@ -142,7 +159,7 @@ namespace WebSocketSharp.Server
|
||||
/// </value>
|
||||
public IEnumerable<string> InactiveIDs {
|
||||
get {
|
||||
foreach (var res in Broadping (WebSocketFrame.EmptyUnmaskPingData, 1000))
|
||||
foreach (var res in Broadping (WebSocketFrame.EmptyUnmaskPingData, _waitTime))
|
||||
if (!res.Value)
|
||||
yield return res.Key;
|
||||
}
|
||||
@@ -318,14 +335,14 @@ namespace WebSocketSharp.Server
|
||||
}
|
||||
}
|
||||
|
||||
internal Dictionary<string, bool> Broadping (byte[] frameAsBytes, int millisecondsTimeout)
|
||||
internal Dictionary<string, bool> Broadping (byte[] frameAsBytes, TimeSpan timeout)
|
||||
{
|
||||
var res = new Dictionary<string, bool> ();
|
||||
foreach (var session in Sessions) {
|
||||
if (_state != ServerState.Start)
|
||||
break;
|
||||
|
||||
res.Add (session.ID, session.Context.WebSocket.Ping (frameAsBytes, millisecondsTimeout));
|
||||
res.Add (session.ID, session.Context.WebSocket.Ping (frameAsBytes, timeout));
|
||||
}
|
||||
|
||||
return res;
|
||||
@@ -345,14 +362,14 @@ namespace WebSocketSharp.Server
|
||||
}
|
||||
}
|
||||
|
||||
internal void Stop (CloseEventArgs e, byte[] frameAsBytes)
|
||||
internal void Stop (CloseEventArgs e, byte[] frameAsBytes, TimeSpan timeout)
|
||||
{
|
||||
lock (_sync) {
|
||||
_state = ServerState.ShuttingDown;
|
||||
|
||||
_sweepTimer.Enabled = false;
|
||||
foreach (var session in _sessions.Values.ToList ())
|
||||
session.Context.WebSocket.Close (e, frameAsBytes, 1000);
|
||||
session.Context.WebSocket.Close (e, frameAsBytes, timeout);
|
||||
|
||||
_state = ServerState.Stop;
|
||||
}
|
||||
@@ -528,7 +545,7 @@ namespace WebSocketSharp.Server
|
||||
return null;
|
||||
}
|
||||
|
||||
return Broadping (WebSocketFrame.EmptyUnmaskPingData, 1000);
|
||||
return Broadping (WebSocketFrame.EmptyUnmaskPingData, _waitTime);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -557,7 +574,7 @@ namespace WebSocketSharp.Server
|
||||
return null;
|
||||
}
|
||||
|
||||
return Broadping (WebSocketFrame.CreatePingFrame (Mask.Unmask, data).ToByteArray (), 1000);
|
||||
return Broadping (WebSocketFrame.CreatePingFrame (data, false).ToByteArray (), _waitTime);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
Reference in New Issue
Block a user