* Add request info to RateLimitedException * Remove Promise from interface. * Add Request to HttpException.pull/959/head
@@ -1,4 +1,4 @@ | |||||
using System; | |||||
using System; | |||||
using System.Net; | using System.Net; | ||||
namespace Discord.Net | namespace Discord.Net | ||||
@@ -8,11 +8,13 @@ namespace Discord.Net | |||||
public HttpStatusCode HttpCode { get; } | public HttpStatusCode HttpCode { get; } | ||||
public int? DiscordCode { get; } | public int? DiscordCode { get; } | ||||
public string Reason { get; } | public string Reason { get; } | ||||
public IRequest Request { get; } | |||||
public HttpException(HttpStatusCode httpCode, int? discordCode = null, string reason = null) | |||||
public HttpException(HttpStatusCode httpCode, IRequest request, int? discordCode = null, string reason = null) | |||||
: base(CreateMessage(httpCode, discordCode, reason)) | : base(CreateMessage(httpCode, discordCode, reason)) | ||||
{ | { | ||||
HttpCode = httpCode; | HttpCode = httpCode; | ||||
Request = request; | |||||
DiscordCode = discordCode; | DiscordCode = discordCode; | ||||
Reason = reason; | Reason = reason; | ||||
} | } | ||||
@@ -0,0 +1,10 @@ | |||||
using System; | |||||
namespace Discord.Net | |||||
{ | |||||
public interface IRequest | |||||
{ | |||||
DateTimeOffset? TimeoutAt { get; } | |||||
RequestOptions Options { get; } | |||||
} | |||||
} |
@@ -1,12 +1,15 @@ | |||||
using System; | |||||
using System; | |||||
namespace Discord.Net | namespace Discord.Net | ||||
{ | { | ||||
public class RateLimitedException : TimeoutException | public class RateLimitedException : TimeoutException | ||||
{ | { | ||||
public RateLimitedException() | |||||
public IRequest Request { get; } | |||||
public RateLimitedException(IRequest request) | |||||
: base("You are being rate limited.") | : base("You are being rate limited.") | ||||
{ | { | ||||
Request = request; | |||||
} | } | ||||
} | } | ||||
} | } |
@@ -1,4 +1,4 @@ | |||||
using Newtonsoft.Json; | |||||
using Newtonsoft.Json; | |||||
using Newtonsoft.Json.Linq; | using Newtonsoft.Json.Linq; | ||||
using System; | using System; | ||||
#if DEBUG_LIMITS | #if DEBUG_LIMITS | ||||
@@ -86,7 +86,7 @@ namespace Discord.Net.Queue | |||||
Debug.WriteLine($"[{id}] (!) 502"); | Debug.WriteLine($"[{id}] (!) 502"); | ||||
#endif | #endif | ||||
if ((request.Options.RetryMode & RetryMode.Retry502) == 0) | if ((request.Options.RetryMode & RetryMode.Retry502) == 0) | ||||
throw new HttpException(HttpStatusCode.BadGateway, null); | |||||
throw new HttpException(HttpStatusCode.BadGateway, request, null); | |||||
continue; //Retry | continue; //Retry | ||||
default: | default: | ||||
@@ -106,7 +106,7 @@ namespace Discord.Net.Queue | |||||
} | } | ||||
catch { } | catch { } | ||||
} | } | ||||
throw new HttpException(response.StatusCode, code, reason); | |||||
throw new HttpException(response.StatusCode, request, code, reason); | |||||
} | } | ||||
} | } | ||||
else | else | ||||
@@ -163,7 +163,7 @@ namespace Discord.Net.Queue | |||||
if (!isRateLimited) | if (!isRateLimited) | ||||
throw new TimeoutException(); | throw new TimeoutException(); | ||||
else | else | ||||
throw new RateLimitedException(); | |||||
throw new RateLimitedException(request); | |||||
} | } | ||||
lock (_lock) | lock (_lock) | ||||
@@ -182,12 +182,12 @@ namespace Discord.Net.Queue | |||||
} | } | ||||
if ((request.Options.RetryMode & RetryMode.RetryRatelimit) == 0) | if ((request.Options.RetryMode & RetryMode.RetryRatelimit) == 0) | ||||
throw new RateLimitedException(); | |||||
throw new RateLimitedException(request); | |||||
if (resetAt.HasValue) | if (resetAt.HasValue) | ||||
{ | { | ||||
if (resetAt > timeoutAt) | if (resetAt > timeoutAt) | ||||
throw new RateLimitedException(); | |||||
throw new RateLimitedException(request); | |||||
int millis = (int)Math.Ceiling((resetAt.Value - DateTimeOffset.UtcNow).TotalMilliseconds); | int millis = (int)Math.Ceiling((resetAt.Value - DateTimeOffset.UtcNow).TotalMilliseconds); | ||||
#if DEBUG_LIMITS | #if DEBUG_LIMITS | ||||
Debug.WriteLine($"[{id}] Sleeping {millis} ms (Pre-emptive)"); | Debug.WriteLine($"[{id}] Sleeping {millis} ms (Pre-emptive)"); | ||||
@@ -198,7 +198,7 @@ namespace Discord.Net.Queue | |||||
else | else | ||||
{ | { | ||||
if ((timeoutAt.Value - DateTimeOffset.UtcNow).TotalMilliseconds < 500.0) | if ((timeoutAt.Value - DateTimeOffset.UtcNow).TotalMilliseconds < 500.0) | ||||
throw new RateLimitedException(); | |||||
throw new RateLimitedException(request); | |||||
#if DEBUG_LIMITS | #if DEBUG_LIMITS | ||||
Debug.WriteLine($"[{id}] Sleeping 500* ms (Pre-emptive)"); | Debug.WriteLine($"[{id}] Sleeping 500* ms (Pre-emptive)"); | ||||
#endif | #endif | ||||
@@ -1,11 +1,11 @@ | |||||
using Discord.Net.Rest; | |||||
using Discord.Net.Rest; | |||||
using System; | using System; | ||||
using System.IO; | using System.IO; | ||||
using System.Threading.Tasks; | using System.Threading.Tasks; | ||||
namespace Discord.Net.Queue | namespace Discord.Net.Queue | ||||
{ | { | ||||
public class RestRequest | |||||
public class RestRequest : IRequest | |||||
{ | { | ||||
public IRestClient Client { get; } | public IRestClient Client { get; } | ||||
public string Method { get; } | public string Method { get; } | ||||
@@ -1,4 +1,4 @@ | |||||
using Discord.Net.WebSockets; | |||||
using Discord.Net.WebSockets; | |||||
using System; | using System; | ||||
using System.IO; | using System.IO; | ||||
using System.Threading; | using System.Threading; | ||||
@@ -6,7 +6,7 @@ using System.Threading.Tasks; | |||||
namespace Discord.Net.Queue | namespace Discord.Net.Queue | ||||
{ | { | ||||
public class WebSocketRequest | |||||
public class WebSocketRequest : IRequest | |||||
{ | { | ||||
public IWebSocketClient Client { get; } | public IWebSocketClient Client { get; } | ||||
public string BucketId { get; } | public string BucketId { get; } | ||||