diff --git a/src/Discord.Net/Helpers/Http.cs b/src/Discord.Net/Helpers/Http.cs index f40e38907..676b58757 100644 --- a/src/Discord.Net/Helpers/Http.cs +++ b/src/Discord.Net/Helpers/Http.cs @@ -1,11 +1,11 @@ using Newtonsoft.Json; using System; -using System.IO; -using System.IO.Compression; using System.Text; using System.Threading.Tasks; using System.Net.Http; using System.Reflection; +using System.Diagnostics; +using System.Net; namespace Discord.Helpers { @@ -21,9 +21,14 @@ namespace Discord.Helpers static Http() { - _client = new HttpClient(); + _client = new HttpClient(new HttpClientHandler + { + AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip, + UseCookies = false, + PreAuthenticate = false //We do auth ourselves + }); _client.DefaultRequestHeaders.Add("accept", "*/*"); - _client.DefaultRequestHeaders.Add("accept-language", "en-US;q=0.8"); + _client.DefaultRequestHeaders.Add("accept-encoding", "gzip, deflate"); string version = typeof(Http).GetTypeInfo().Assembly.GetName().Version.ToString(2); _client.DefaultRequestHeaders.Add("user-agent", $"Discord.Net/{version} (https://github.com/RogueException/Discord.Net)"); @@ -115,23 +120,36 @@ namespace Discord.Helpers private static async Task SendRequest(HttpMethod method, string path, string data, bool hasResponse) { - //Create Request +#if DEBUG + Stopwatch stopwatch = Stopwatch.StartNew(); +#endif HttpRequestMessage msg = new HttpRequestMessage(method, path); - - //Add Payload + if (data != null) msg.Content = new StringContent(data, Encoding.UTF8, "application/json"); - if (!hasResponse) + string result; + HttpResponseMessage response; + if (hasResponse) { - await _client.SendAsync(msg, HttpCompletionOption.ResponseHeadersRead); - return null; + response = await _client.SendAsync(msg, HttpCompletionOption.ResponseContentRead); + if (!response.IsSuccessStatusCode) + throw new InvalidOperationException($"The server responded with error {(int)response.StatusCode}."); + result = await response.Content.ReadAsStringAsync(); } else { - var response = await _client.SendAsync(msg, HttpCompletionOption.ResponseContentRead); - return await response.Content.ReadAsStringAsync(); - } + response = await _client.SendAsync(msg, HttpCompletionOption.ResponseHeadersRead); + if (!response.IsSuccessStatusCode) + throw new InvalidOperationException($"The server responded with error {(int)response.StatusCode}."); + result = null; + } + +#if DEBUG + stopwatch.Stop(); + Debug.WriteLine($"{method} {path}: {Math.Round(stopwatch.ElapsedTicks / (double)TimeSpan.TicksPerMillisecond, 2)}ms"); +#endif + return result; } #if DEBUG