Add request info to HttpException & RateLimitedException (#957)
* Add request info to RateLimitedException * Remove Promise from interface. * Add Request to HttpException.
This commit is contained in:
committed by
Christopher F
parent
bb8ebc13d2
commit
500f5f434a
@@ -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
src/Discord.Net.Core/Net/IRequest.cs
Normal file
10
src/Discord.Net.Core/Net/IRequest.cs
Normal file
@@ -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; }
|
||||||
|
|||||||
Reference in New Issue
Block a user