| @@ -1,11 +1,11 @@ | |||||
| using Newtonsoft.Json; | using Newtonsoft.Json; | ||||
| using System; | using System; | ||||
| using System.IO; | |||||
| using System.IO.Compression; | |||||
| using System.Text; | using System.Text; | ||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||
| using System.Net.Http; | using System.Net.Http; | ||||
| using System.Reflection; | using System.Reflection; | ||||
| using System.Diagnostics; | |||||
| using System.Net; | |||||
| namespace Discord.Helpers | namespace Discord.Helpers | ||||
| { | { | ||||
| @@ -21,9 +21,14 @@ namespace Discord.Helpers | |||||
| static Http() | 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", "*/*"); | ||||
| _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); | string version = typeof(Http).GetTypeInfo().Assembly.GetName().Version.ToString(2); | ||||
| _client.DefaultRequestHeaders.Add("user-agent", $"Discord.Net/{version} (https://github.com/RogueException/Discord.Net)"); | _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<string> SendRequest(HttpMethod method, string path, string data, bool hasResponse) | private static async Task<string> SendRequest(HttpMethod method, string path, string data, bool hasResponse) | ||||
| { | { | ||||
| //Create Request | |||||
| #if DEBUG | |||||
| Stopwatch stopwatch = Stopwatch.StartNew(); | |||||
| #endif | |||||
| HttpRequestMessage msg = new HttpRequestMessage(method, path); | HttpRequestMessage msg = new HttpRequestMessage(method, path); | ||||
| //Add Payload | |||||
| if (data != null) | if (data != null) | ||||
| msg.Content = new StringContent(data, Encoding.UTF8, "application/json"); | 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 | 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 | #if DEBUG | ||||