Browse Source

Add request info to HttpException & RateLimitedException (#957)

* Add request info to RateLimitedException

* Remove Promise from interface.

* Add Request to HttpException.
tags/2.0
Alex Gravely Christopher F 7 years ago
parent
commit
500f5f434a
6 changed files with 30 additions and 15 deletions
  1. +4
    -2
      src/Discord.Net.Core/Net/HttpException.cs
  2. +10
    -0
      src/Discord.Net.Core/Net/IRequest.cs
  3. +5
    -2
      src/Discord.Net.Core/Net/RateLimitedException.cs
  4. +7
    -7
      src/Discord.Net.Rest/Net/Queue/RequestQueueBucket.cs
  5. +2
    -2
      src/Discord.Net.Rest/Net/Queue/Requests/RestRequest.cs
  6. +2
    -2
      src/Discord.Net.Rest/Net/Queue/Requests/WebSocketRequest.cs

+ 4
- 2
src/Discord.Net.Core/Net/HttpException.cs View File

@@ -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;
} }


+ 10
- 0
src/Discord.Net.Core/Net/IRequest.cs View File

@@ -0,0 +1,10 @@
using System;

namespace Discord.Net
{
public interface IRequest
{
DateTimeOffset? TimeoutAt { get; }
RequestOptions Options { get; }
}
}

+ 5
- 2
src/Discord.Net.Core/Net/RateLimitedException.cs View File

@@ -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;
} }
} }
} }

+ 7
- 7
src/Discord.Net.Rest/Net/Queue/RequestQueueBucket.cs View File

@@ -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


+ 2
- 2
src/Discord.Net.Rest/Net/Queue/Requests/RestRequest.cs View File

@@ -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; }


+ 2
- 2
src/Discord.Net.Rest/Net/Queue/Requests/WebSocketRequest.cs View File

@@ -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; }


Loading…
Cancel
Save