From 0d85b805b60622ab4d938cd78979b29b7d0c6595 Mon Sep 17 00:00:00 2001 From: RogueException Date: Wed, 16 Sep 2015 15:25:59 -0300 Subject: [PATCH] Attempt 3 for fixing SSL/TLS bug --- .../Net/API/RestClient.SharpRest.cs | 24 +++++++++++++++---- src/Discord.Net/Net/API/RestClient.cs | 15 ------------ 2 files changed, 19 insertions(+), 20 deletions(-) diff --git a/src/Discord.Net/Net/API/RestClient.SharpRest.cs b/src/Discord.Net/Net/API/RestClient.SharpRest.cs index f14d575e8..38a93ad33 100644 --- a/src/Discord.Net/Net/API/RestClient.SharpRest.cs +++ b/src/Discord.Net/Net/API/RestClient.SharpRest.cs @@ -44,11 +44,25 @@ namespace Discord.Net.API } private async Task Send(RestRequest request, CancellationToken cancelToken) { - var response = await _client.ExecuteTaskAsync(request, cancelToken).ConfigureAwait(false); - int statusCode = (int)response.StatusCode; - if (statusCode < 200 || statusCode >= 300) //2xx = Success - throw new HttpException(response.StatusCode); - return response.Content; + bool hasRetried = false; + while (true) + { + var response = await _client.ExecuteTaskAsync(request, cancelToken).ConfigureAwait(false); + int statusCode = (int)response.StatusCode; + if (statusCode == 0) //Internal Error + { + if (!hasRetried) + { + //SSL/TTS Error seems to work if we immediately retry + hasRetried = true; + continue; + } + throw response.ErrorException; + } + if (statusCode < 200 || statusCode >= 300) //2xx = Success + throw new HttpException(response.StatusCode); + return response.Content; + } } private Method GetMethod(HttpMethod method) diff --git a/src/Discord.Net/Net/API/RestClient.cs b/src/Discord.Net/Net/API/RestClient.cs index ea831888b..c4446b281 100644 --- a/src/Discord.Net/Net/API/RestClient.cs +++ b/src/Discord.Net/Net/API/RestClient.cs @@ -1,7 +1,6 @@ using Newtonsoft.Json; using System; using System.Diagnostics; -using System.Net; using System.Net.Http; using System.Reflection; using System.Threading; @@ -21,7 +20,6 @@ namespace Discord.Net.API private readonly IRestEngine _engine; private readonly LogMessageSeverity _logLevel; private CancellationToken _cancelToken; - private ServicePoint _servicePoint; public RestClient(LogMessageSeverity logLevel) { @@ -111,8 +109,6 @@ namespace Discord.Net.API stopwatch = Stopwatch.StartNew(); string responseJson = await _engine.Send(method, path, requestJson, _cancelToken).ConfigureAwait(false); - if (_servicePoint == null) - ConfigureServicePoint(); #if TEST_RESPONSES if (!hasResponse && !string.IsNullOrEmpty(responseJson)) @@ -152,8 +148,6 @@ namespace Discord.Net.API stopwatch = Stopwatch.StartNew(); string responseJson = await _engine.SendFile(method, path, filePath, _cancelToken).ConfigureAwait(false); - if (_servicePoint == null) - ConfigureServicePoint(); #if TEST_RESPONSES if (!hasResponse && !string.IsNullOrEmpty(responseJson)) @@ -192,14 +186,5 @@ namespace Discord.Net.API internal void SetToken(string token) => _engine.SetToken(token); internal void SetCancelToken(CancellationToken token) => _cancelToken = token; - - private void ConfigureServicePoint() - { - _servicePoint = ServicePointManager.FindServicePoint(new Uri(Endpoints.BaseApi)); - _servicePoint.Expect100Continue = true; - _servicePoint.UseNagleAlgorithm = false; - _servicePoint.MaxIdleTime = int.MaxValue; - _servicePoint.ConnectionLeaseTimeout = int.MaxValue; - } } }