From e9bef04f8ff011f98de27332335a1e3aba54443f Mon Sep 17 00:00:00 2001 From: Abhishek Nanda Date: Fri, 6 Dec 2013 17:30:57 -0800 Subject: [PATCH 1/2] Modified transport connect timeout so that it doesn't add over multiple negotiate requests #2738 --- .../Connection.cs | 19 ++++++++++++++++++- .../IConnection.cs | 1 + .../Transports/HttpBasedTransport.cs | 2 +- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.SignalR.Client/Connection.cs b/src/Microsoft.AspNet.SignalR.Client/Connection.cs index 311c863a3e..faf184d773 100644 --- a/src/Microsoft.AspNet.SignalR.Client/Connection.cs +++ b/src/Microsoft.AspNet.SignalR.Client/Connection.cs @@ -42,6 +42,9 @@ public class Connection : IConnection, IDisposable // The amount of time the client should attempt to reconnect before stopping. private TimeSpan _disconnectTimeout; + // The amount of time a transport will wait (while connecting) before failing. + private TimeSpan _totalTransportConnectTimeout; + // Provides a way to cancel the the timeout that stops a reconnect cycle private IDisposable _disconnectTimeoutOperation; @@ -176,6 +179,7 @@ public Connection(string url, string queryString) TraceWriter = new DebugTextWriter(); Headers = new HeaderDictionary(this); TransportConnectTimeout = TimeSpan.Zero; + _totalTransportConnectTimeout = TimeSpan.Zero; // Current client protocol Protocol = new Version(1, 3); @@ -187,6 +191,18 @@ public Connection(string url, string queryString) /// public TimeSpan TransportConnectTimeout { get; set; } + /// + /// The amount of time a transport will wait (while connecting) before failing. + /// This is the total vaue obtained by adding the server's configuration value and the timeout specified by the user + /// + TimeSpan IConnection.TotalTransportConnectTimeout + { + get + { + return _totalTransportConnectTimeout; + } + } + public Version Protocol { get; set; } /// @@ -446,7 +462,7 @@ private Task Negotiate(IClientTransport transport) ConnectionId = negotiationResponse.ConnectionId; ConnectionToken = negotiationResponse.ConnectionToken; _disconnectTimeout = TimeSpan.FromSeconds(negotiationResponse.DisconnectTimeout); - TransportConnectTimeout = TransportConnectTimeout + TimeSpan.FromSeconds(negotiationResponse.TransportConnectTimeout); + _totalTransportConnectTimeout = TransportConnectTimeout + TimeSpan.FromSeconds(negotiationResponse.TransportConnectTimeout); // Default the beat interval to be 5 seconds in case keep alive is disabled. var beatInterval = TimeSpan.FromSeconds(5); @@ -624,6 +640,7 @@ private void Disconnect() Trace(TraceLevels.Events, "Closed"); // Clear the state for this connection + _totalTransportConnectTimeout = TimeSpan.Zero; ConnectionId = null; ConnectionToken = null; GroupsToken = null; diff --git a/src/Microsoft.AspNet.SignalR.Client/IConnection.cs b/src/Microsoft.AspNet.SignalR.Client/IConnection.cs index ebf16482c0..9ef5cddeb6 100644 --- a/src/Microsoft.AspNet.SignalR.Client/IConnection.cs +++ b/src/Microsoft.AspNet.SignalR.Client/IConnection.cs @@ -21,6 +21,7 @@ public interface IConnection { Version Protocol { get; set; } TimeSpan TransportConnectTimeout { get; set; } + TimeSpan TotalTransportConnectTimeout { get; } TimeSpan ReconnectWindow { get; set; } KeepAliveData KeepAliveData { get; set; } string MessageId { get; set; } diff --git a/src/Microsoft.AspNet.SignalR.Client/Transports/HttpBasedTransport.cs b/src/Microsoft.AspNet.SignalR.Client/Transports/HttpBasedTransport.cs index 07e9e87f4e..94042136fd 100644 --- a/src/Microsoft.AspNet.SignalR.Client/Transports/HttpBasedTransport.cs +++ b/src/Microsoft.AspNet.SignalR.Client/Transports/HttpBasedTransport.cs @@ -66,7 +66,7 @@ public Task Start(IConnection connection, string connectionData, CancellationTok throw new ArgumentNullException("connection"); } - var initializeHandler = new TransportInitializationHandler(connection.TransportConnectTimeout, disconnectToken); + var initializeHandler = new TransportInitializationHandler(connection.TotalTransportConnectTimeout, disconnectToken); OnStart(connection, connectionData, disconnectToken, initializeHandler); From 002865fd501f316490b2848e7f76f80dd4bcf0c7 Mon Sep 17 00:00:00 2001 From: Abhishek Nanda Date: Tue, 10 Dec 2013 15:15:35 -0800 Subject: [PATCH 2/2] Made changes as per code review feedback #2738 --- .../Connection.cs | 1 - .../Transports/WebSocketTransport.cs | 2 +- .../Client/ConnectionFacts.cs | 20 +++++++++++++++++++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.SignalR.Client/Connection.cs b/src/Microsoft.AspNet.SignalR.Client/Connection.cs index faf184d773..81274e2706 100644 --- a/src/Microsoft.AspNet.SignalR.Client/Connection.cs +++ b/src/Microsoft.AspNet.SignalR.Client/Connection.cs @@ -640,7 +640,6 @@ private void Disconnect() Trace(TraceLevels.Events, "Closed"); // Clear the state for this connection - _totalTransportConnectTimeout = TimeSpan.Zero; ConnectionId = null; ConnectionToken = null; GroupsToken = null; diff --git a/src/Microsoft.AspNet.SignalR.Client45/Transports/WebSocketTransport.cs b/src/Microsoft.AspNet.SignalR.Client45/Transports/WebSocketTransport.cs index e765920710..fff73c1a33 100644 --- a/src/Microsoft.AspNet.SignalR.Client45/Transports/WebSocketTransport.cs +++ b/src/Microsoft.AspNet.SignalR.Client45/Transports/WebSocketTransport.cs @@ -75,7 +75,7 @@ public virtual Task Start(IConnection connection, string connectionData, Cancell throw new ArgumentNullException("connection"); } - _initializeHandler = new TransportInitializationHandler(connection.TransportConnectTimeout, disconnectToken); + _initializeHandler = new TransportInitializationHandler(connection.TotalTransportConnectTimeout, disconnectToken); // Tie into the OnFailure event so that we can stop the transport silently. _initializeHandler.OnFailure += () => diff --git a/tests/Microsoft.AspNet.SignalR.FunctionalTests/Client/ConnectionFacts.cs b/tests/Microsoft.AspNet.SignalR.FunctionalTests/Client/ConnectionFacts.cs index 0fd4e6cce5..aeacf3ccdf 100644 --- a/tests/Microsoft.AspNet.SignalR.FunctionalTests/Client/ConnectionFacts.cs +++ b/tests/Microsoft.AspNet.SignalR.FunctionalTests/Client/ConnectionFacts.cs @@ -231,6 +231,26 @@ public void WebSocketsTransportFailsIfOnConnectedThrows() } } + [Fact] + public void TransportConnectTimeoutDoesNotAddupOverNegotiateRequests() + { + using (ITestHost host = CreateHost(HostType.IISExpress)) + { + host.Initialize(); + var connection = CreateConnection(host, "/signalr"); + connection.TransportConnectTimeout = TimeSpan.FromSeconds(5); + + using (connection) + { + connection.Start().Wait(); + var totalTransportConnectTimeout = ((Client.IConnection)connection).TotalTransportConnectTimeout; + connection.Stop(); + connection.Start().Wait(); + Assert.Equal(((Client.IConnection)connection).TotalTransportConnectTimeout, totalTransportConnectTimeout); + } + } + } + [Theory] [InlineData("1337.0", HostType.Memory, TransportType.ServerSentEvents, MessageBusType.Default)] [InlineData("1337.0", HostType.Memory, TransportType.ServerSentEvents, MessageBusType.Fake)]