Skip to content

Commit

Permalink
Add request info to HttpException & RateLimitedException (#957)
Browse files Browse the repository at this point in the history
* Add request info to RateLimitedException

* Remove Promise from interface.

* Add Request to HttpException.
  • Loading branch information
AntiTcb authored and foxbot committed Feb 19, 2018
1 parent bb8ebc1 commit 500f5f4
Show file tree
Hide file tree
Showing 6 changed files with 30 additions and 15 deletions.
6 changes: 4 additions & 2 deletions src/Discord.Net.Core/Net/HttpException.cs
@@ -1,4 +1,4 @@
using System;
using System;
using System.Net;

namespace Discord.Net
Expand All @@ -8,11 +8,13 @@ public class HttpException : Exception
public HttpStatusCode HttpCode { get; }
public int? DiscordCode { 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))
{
HttpCode = httpCode;
Request = request;
DiscordCode = discordCode;
Reason = reason;
}
Expand Down
10 changes: 10 additions & 0 deletions src/Discord.Net.Core/Net/IRequest.cs
@@ -0,0 +1,10 @@
using System;

namespace Discord.Net
{
public interface IRequest
{
DateTimeOffset? TimeoutAt { get; }
RequestOptions Options { get; }
}
}
7 changes: 5 additions & 2 deletions src/Discord.Net.Core/Net/RateLimitedException.cs
@@ -1,12 +1,15 @@
using System;
using System;

namespace Discord.Net
{
public class RateLimitedException : TimeoutException
{
public RateLimitedException()
public IRequest Request { get; }

public RateLimitedException(IRequest request)
: base("You are being rate limited.")
{
Request = request;
}
}
}
14 changes: 7 additions & 7 deletions src/Discord.Net.Rest/Net/Queue/RequestQueueBucket.cs
@@ -1,4 +1,4 @@
using Newtonsoft.Json;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
#if DEBUG_LIMITS
Expand Down Expand Up @@ -86,7 +86,7 @@ public async Task<Stream> SendAsync(RestRequest request)
Debug.WriteLine($"[{id}] (!) 502");
#endif
if ((request.Options.RetryMode & RetryMode.Retry502) == 0)
throw new HttpException(HttpStatusCode.BadGateway, null);
throw new HttpException(HttpStatusCode.BadGateway, request, null);

continue; //Retry
default:
Expand All @@ -106,7 +106,7 @@ public async Task<Stream> SendAsync(RestRequest request)
}
catch { }
}
throw new HttpException(response.StatusCode, code, reason);
throw new HttpException(response.StatusCode, request, code, reason);
}
}
else
Expand Down Expand Up @@ -163,7 +163,7 @@ private async Task EnterAsync(int id, RestRequest request)
if (!isRateLimited)
throw new TimeoutException();
else
throw new RateLimitedException();
throw new RateLimitedException(request);
}

lock (_lock)
Expand All @@ -182,12 +182,12 @@ private async Task EnterAsync(int id, RestRequest request)
}

if ((request.Options.RetryMode & RetryMode.RetryRatelimit) == 0)
throw new RateLimitedException();
throw new RateLimitedException(request);

if (resetAt.HasValue)
{
if (resetAt > timeoutAt)
throw new RateLimitedException();
throw new RateLimitedException(request);
int millis = (int)Math.Ceiling((resetAt.Value - DateTimeOffset.UtcNow).TotalMilliseconds);
#if DEBUG_LIMITS
Debug.WriteLine($"[{id}] Sleeping {millis} ms (Pre-emptive)");
Expand All @@ -198,7 +198,7 @@ private async Task EnterAsync(int id, RestRequest request)
else
{
if ((timeoutAt.Value - DateTimeOffset.UtcNow).TotalMilliseconds < 500.0)
throw new RateLimitedException();
throw new RateLimitedException(request);
#if DEBUG_LIMITS
Debug.WriteLine($"[{id}] Sleeping 500* ms (Pre-emptive)");
#endif
Expand Down
4 changes: 2 additions & 2 deletions src/Discord.Net.Rest/Net/Queue/Requests/RestRequest.cs
@@ -1,11 +1,11 @@
using Discord.Net.Rest;
using Discord.Net.Rest;
using System;
using System.IO;
using System.Threading.Tasks;

namespace Discord.Net.Queue
{
public class RestRequest
public class RestRequest : IRequest
{
public IRestClient Client { get; }
public string Method { get; }
Expand Down
4 changes: 2 additions & 2 deletions src/Discord.Net.Rest/Net/Queue/Requests/WebSocketRequest.cs
@@ -1,12 +1,12 @@
using Discord.Net.WebSockets;
using Discord.Net.WebSockets;
using System;
using System.IO;
using System.Threading;
using System.Threading.Tasks;

namespace Discord.Net.Queue
{
public class WebSocketRequest
public class WebSocketRequest : IRequest
{
public IWebSocketClient Client { get; }
public string BucketId { get; }
Expand Down

0 comments on commit 500f5f4

Please sign in to comment.