diff --git a/ApiClient/SpeckleApiClientApiCalls.cs b/ApiClient/SpeckleApiClientApiCalls.cs index 38d4692..80607d2 100644 --- a/ApiClient/SpeckleApiClientApiCalls.cs +++ b/ApiClient/SpeckleApiClientApiCalls.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Net; using System.Text; using System.Threading.Tasks; @@ -394,7 +395,11 @@ public async System.Threading.Tasks.Task UserGetAsync( System.Thre } } } - finally + catch (TaskCanceledException) + { + throw new SpeckleException("Connection timeout with Speckle Server", (int)HttpStatusCode.RequestTimeout, null, null, null); + } + finally { if ( client_ != null ) client_.Dispose(); @@ -2391,7 +2396,11 @@ public async System.Threading.Tasks.Task StreamGetAsync( string } } } - finally + catch (TaskCanceledException) + { + throw new SpeckleException("Connection timeout with Speckle Server", (int)HttpStatusCode.RequestTimeout, null, null, null); + } + finally { if ( client_ != null ) client_.Dispose(); @@ -2688,6 +2697,10 @@ public async System.Threading.Tasks.Task StreamGetObjectsAsync( return default( ResponseObject ); } + catch (TaskCanceledException) + { + throw new SpeckleException("Connection timeout with Speckle server", (int) HttpStatusCode.RequestTimeout, null, null, null); + } finally { if ( response_ != null ) @@ -3412,7 +3425,7 @@ public async System.Threading.Tasks.Task ObjectGetBulkAsync( str if ( query != null ) urlBuilder_.Append( query ); - var client_ = GetHttpClient(); + var client_ = GetHttpClient(defaultBulkTimeoutMilliseconds); try { using ( var request_ = new System.Net.Http.HttpRequestMessage() ) diff --git a/ApiClient/SpeckleApiClientExtension.cs b/ApiClient/SpeckleApiClientExtension.cs index 387e7cc..26b9fa0 100644 --- a/ApiClient/SpeckleApiClientExtension.cs +++ b/ApiClient/SpeckleApiClientExtension.cs @@ -55,6 +55,10 @@ public partial class SpeckleApiClient : ISerializable Timer IsReady, WsReconnecter; + //Default timeouts, pending further discussion + private double defaultTimeoutMilliseconds = 3000; + private double defaultBulkTimeoutMilliseconds = 60000; + private Dictionary ObjectCache = new Dictionary(); diff --git a/ApiClient/SpeckleApiClientHead.cs b/ApiClient/SpeckleApiClientHead.cs index 6d51e41..c3fad27 100644 --- a/ApiClient/SpeckleApiClientHead.cs +++ b/ApiClient/SpeckleApiClientHead.cs @@ -41,11 +41,16 @@ partial void PrepareRequest( HttpClient client, HttpRequestMessage request, stri request.Content = new GzipContent( request.Content ); } - private HttpClient GetHttpClient( ) + private HttpClient GetHttpClient(double timeoutMillisecondsOverride = 0) { - var handler = new HttpClientHandler(); - handler.AutomaticDecompression = System.Net.DecompressionMethods.GZip; - return new HttpClient( handler, true ); + var handler = new HttpClientHandler + { + AutomaticDecompression = System.Net.DecompressionMethods.GZip + }; + return new HttpClient(handler, true) + { + Timeout = TimeSpan.FromMilliseconds(timeoutMillisecondsOverride == 0 ? defaultTimeoutMilliseconds : timeoutMillisecondsOverride) + }; } } }