diff --git a/src/Discord.Net/DiscordClient.cs b/src/Discord.Net/DiscordClient.cs index f398709c8..3c7d4da84 100644 --- a/src/Discord.Net/DiscordClient.cs +++ b/src/Discord.Net/DiscordClient.cs @@ -92,7 +92,7 @@ namespace Discord _connectedEvent = new ManualResetEventSlim(false); _rand = new Random(); - _api = new DiscordAPIClient(_config.LogLevel); + _api = new DiscordAPIClient(_config.LogLevel, _config.APITimeout); _dataSocket = new DataWebSocket(this); _dataSocket.Connected += (s, e) => { if (_state == (int)DiscordClientState.Connecting) CompleteConnect(); }; _dataSocket.Disconnected += async (s, e) => { RaiseDisconnected(e); if (e.WasUnexpected) await _dataSocket.Login(_token); }; diff --git a/src/Discord.Net/DiscordClientConfig.cs b/src/Discord.Net/DiscordClientConfig.cs index 7e07043d4..17bc947a3 100644 --- a/src/Discord.Net/DiscordClientConfig.cs +++ b/src/Discord.Net/DiscordClientConfig.cs @@ -17,6 +17,9 @@ namespace Discord /// Gets or sets the time (in milliseconds) to wait after an reconnect fails before retrying. public int FailedReconnectDelay { get { return _failedReconnectDelay; } set { SetValue(ref _failedReconnectDelay, value); } } private int _failedReconnectDelay = 10000; + /// Max time (in milliseconds) to wait for an API request to complete. + public int APITimeout { get { return _apiTimeout; } set { SetValue(ref _apiTimeout, value); } } + private int _apiTimeout = 5000; /// Gets or sets the time (in milliseconds) to wait when the websocket's message queue is empty before checking again. public int WebSocketInterval { get { return _webSocketInterval; } set { SetValue(ref _webSocketInterval, value); } } diff --git a/src/Discord.Net/Net/API/DiscordAPIClient.cs b/src/Discord.Net/Net/API/DiscordAPIClient.cs index b1e4b2c4b..dfe2f4e45 100644 --- a/src/Discord.Net/Net/API/DiscordAPIClient.cs +++ b/src/Discord.Net/Net/API/DiscordAPIClient.cs @@ -11,9 +11,9 @@ namespace Discord.Net.API public RestClient RestClient => _rest; private readonly RestClient _rest; - public DiscordAPIClient(LogMessageSeverity logLevel) + public DiscordAPIClient(LogMessageSeverity logLevel, int timeout) { - _rest = new RestClient(logLevel); + _rest = new RestClient(logLevel, timeout); } private string _token; diff --git a/src/Discord.Net/Net/API/RestClient.BuiltIn.cs b/src/Discord.Net/Net/API/RestClient.BuiltIn.cs index f6b2cb3ae..6ed99e4eb 100644 --- a/src/Discord.Net/Net/API/RestClient.BuiltIn.cs +++ b/src/Discord.Net/Net/API/RestClient.BuiltIn.cs @@ -14,7 +14,7 @@ namespace Discord.Net.API { private readonly HttpClient _client; - public BuiltInRestEngine(string userAgent) + public BuiltInRestEngine(string userAgent, int timeout) { _client = new HttpClient(new HttpClientHandler { @@ -25,6 +25,7 @@ namespace Discord.Net.API _client.DefaultRequestHeaders.Add("accept", "*/*"); _client.DefaultRequestHeaders.Add("accept-encoding", "gzip,deflate"); _client.DefaultRequestHeaders.Add("user-agent", userAgent); + _client.Timeout = TimeSpan.FromMilliseconds(timeout); } public void SetToken(string token) diff --git a/src/Discord.Net/Net/API/RestClient.SharpRest.cs b/src/Discord.Net/Net/API/RestClient.SharpRest.cs index 38a93ad33..e47fa44bb 100644 --- a/src/Discord.Net/Net/API/RestClient.SharpRest.cs +++ b/src/Discord.Net/Net/API/RestClient.SharpRest.cs @@ -12,7 +12,7 @@ namespace Discord.Net.API { private readonly RestSharp.RestClient _client; - public RestSharpRestEngine(string userAgent) + public RestSharpRestEngine(string userAgent, int timeout) { _client = new RestSharp.RestClient(Endpoints.BaseApi) { @@ -20,7 +20,8 @@ namespace Discord.Net.API }; _client.AddDefaultHeader("accept", "*/*"); _client.AddDefaultHeader("accept-encoding", "gzip,deflate"); - _client.UserAgent = userAgent; + _client.UserAgent = userAgent; + _client.ReadWriteTimeout = timeout; } public void SetToken(string token) diff --git a/src/Discord.Net/Net/API/RestClient.cs b/src/Discord.Net/Net/API/RestClient.cs index c4446b281..c2999dbc1 100644 --- a/src/Discord.Net/Net/API/RestClient.cs +++ b/src/Discord.Net/Net/API/RestClient.cs @@ -21,16 +21,16 @@ namespace Discord.Net.API private readonly LogMessageSeverity _logLevel; private CancellationToken _cancelToken; - public RestClient(LogMessageSeverity logLevel) + public RestClient(LogMessageSeverity logLevel, int timeout) { _logLevel = logLevel; string version = typeof(RestClient).GetTypeInfo().Assembly.GetName().Version.ToString(2); string userAgent = $"Discord.Net/{version} (https://github.com/RogueException/Discord.Net)"; #if DNXCORE50 - _engine = new BuiltInRestEngine(userAgent); + _engine = new BuiltInRestEngine(userAgent, timeout); #else - _engine = new RestSharpRestEngine(userAgent); + _engine = new RestSharpRestEngine(userAgent, timeout); #endif }