diff --git a/src/Discord.Net.Core/Net/Rest/IRestClient.cs b/src/Discord.Net.Core/Net/Rest/IRestClient.cs
index 71010f70d..d28fb707e 100644
--- a/src/Discord.Net.Core/Net/Rest/IRestClient.cs
+++ b/src/Discord.Net.Core/Net/Rest/IRestClient.cs
@@ -30,9 +30,13 @@ namespace Discord.Net.Rest
/// The cancellation token used to cancel the task.
/// Indicates whether to send the header only.
/// The audit log reason.
+ /// Additional headers to be sent with the request.
///
- Task SendAsync(string method, string endpoint, CancellationToken cancelToken, bool headerOnly = false, string reason = null);
- Task SendAsync(string method, string endpoint, string json, CancellationToken cancelToken, bool headerOnly = false, string reason = null);
- Task SendAsync(string method, string endpoint, IReadOnlyDictionary multipartParams, CancellationToken cancelToken, bool headerOnly = false, string reason = null);
+ Task SendAsync(string method, string endpoint, CancellationToken cancelToken, bool headerOnly = false, string reason = null,
+ IEnumerable>> requestHeaders = null);
+ Task SendAsync(string method, string endpoint, string json, CancellationToken cancelToken, bool headerOnly = false, string reason = null,
+ IEnumerable>> requestHeaders = null);
+ Task SendAsync(string method, string endpoint, IReadOnlyDictionary multipartParams, CancellationToken cancelToken, bool headerOnly = false, string reason = null,
+ IEnumerable>> requestHeaders = null);
}
}
diff --git a/src/Discord.Net.Core/RequestOptions.cs b/src/Discord.Net.Core/RequestOptions.cs
index 46aa2681f..06dcb3e76 100644
--- a/src/Discord.Net.Core/RequestOptions.cs
+++ b/src/Discord.Net.Core/RequestOptions.cs
@@ -1,5 +1,6 @@
using Discord.Net;
using System;
+using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
@@ -19,7 +20,7 @@ namespace Discord
/// Gets or sets the maximum time to wait for this request to complete.
///
///
- /// Gets or set the max time, in milliseconds, to wait for this request to complete. If
+ /// Gets or set the max time, in milliseconds, to wait for this request to complete. If
/// null, a request will not time out. If a rate limit has been triggered for this request's bucket
/// and will not be unpaused in time, this request will fail immediately.
///
@@ -53,7 +54,7 @@ namespace Discord
///
///
/// This property can also be set in .
- /// On a per-request basis, the system clock should only be disabled
+ /// On a per-request basis, the system clock should only be disabled
/// when millisecond precision is especially important, and the
/// hosting system is known to have a desynced clock.
///
@@ -70,8 +71,10 @@ namespace Discord
internal bool IsReactionBucket { get; set; }
internal bool IsGatewayBucket { get; set; }
+ internal IDictionary> RequestHeaders { get; }
+
internal static RequestOptions CreateOrClone(RequestOptions options)
- {
+ {
if (options == null)
return new RequestOptions();
else
@@ -96,8 +99,9 @@ namespace Discord
public RequestOptions()
{
Timeout = DiscordConfig.DefaultRequestTimeout;
+ RequestHeaders = new Dictionary>();
}
-
+
public RequestOptions Clone() => MemberwiseClone() as RequestOptions;
}
}
diff --git a/src/Discord.Net.Rest/Net/DefaultRestClient.cs b/src/Discord.Net.Rest/Net/DefaultRestClient.cs
index 721c7009d..97872ee6a 100644
--- a/src/Discord.Net.Rest/Net/DefaultRestClient.cs
+++ b/src/Discord.Net.Rest/Net/DefaultRestClient.cs
@@ -66,33 +66,45 @@ namespace Discord.Net.Rest
_cancelToken = cancelToken;
}
- public async Task SendAsync(string method, string endpoint, CancellationToken cancelToken, bool headerOnly, string reason = null)
+ public async Task SendAsync(string method, string endpoint, CancellationToken cancelToken, bool headerOnly, string reason = null,
+ IEnumerable>> requestHeaders = null)
{
string uri = Path.Combine(_baseUrl, endpoint);
using (var restRequest = new HttpRequestMessage(GetMethod(method), uri))
{
if (reason != null) restRequest.Headers.Add("X-Audit-Log-Reason", Uri.EscapeDataString(reason));
+ if (requestHeaders != null)
+ foreach (var header in requestHeaders)
+ restRequest.Headers.Add(header.Key, header.Value);
return await SendInternalAsync(restRequest, cancelToken, headerOnly).ConfigureAwait(false);
}
}
- public async Task SendAsync(string method, string endpoint, string json, CancellationToken cancelToken, bool headerOnly, string reason = null)
+ public async Task SendAsync(string method, string endpoint, string json, CancellationToken cancelToken, bool headerOnly, string reason = null,
+ IEnumerable>> requestHeaders = null)
{
string uri = Path.Combine(_baseUrl, endpoint);
using (var restRequest = new HttpRequestMessage(GetMethod(method), uri))
{
if (reason != null) restRequest.Headers.Add("X-Audit-Log-Reason", Uri.EscapeDataString(reason));
+ if (requestHeaders != null)
+ foreach (var header in requestHeaders)
+ restRequest.Headers.Add(header.Key, header.Value);
restRequest.Content = new StringContent(json, Encoding.UTF8, "application/json");
return await SendInternalAsync(restRequest, cancelToken, headerOnly).ConfigureAwait(false);
}
}
/// Unsupported param type.
- public async Task SendAsync(string method, string endpoint, IReadOnlyDictionary multipartParams, CancellationToken cancelToken, bool headerOnly, string reason = null)
+ public async Task SendAsync(string method, string endpoint, IReadOnlyDictionary multipartParams, CancellationToken cancelToken, bool headerOnly, string reason = null,
+ IEnumerable>> requestHeaders = null)
{
string uri = Path.Combine(_baseUrl, endpoint);
using (var restRequest = new HttpRequestMessage(GetMethod(method), uri))
{
if (reason != null) restRequest.Headers.Add("X-Audit-Log-Reason", Uri.EscapeDataString(reason));
+ if (requestHeaders != null)
+ foreach (var header in requestHeaders)
+ restRequest.Headers.Add(header.Key, header.Value);
var content = new MultipartFormDataContent("Upload----" + DateTime.Now.ToString(CultureInfo.InvariantCulture));
MemoryStream memoryStream = null;
if (multipartParams != null)
@@ -126,7 +138,7 @@ namespace Discord.Net.Rest
content.Add(streamContent, p.Key, fileValue.Filename);
#pragma warning restore IDISP004
-
+
continue;
}
default:
diff --git a/src/Discord.Net.Rest/Net/Queue/Requests/RestRequest.cs b/src/Discord.Net.Rest/Net/Queue/Requests/RestRequest.cs
index bb5840ce2..e5cab831e 100644
--- a/src/Discord.Net.Rest/Net/Queue/Requests/RestRequest.cs
+++ b/src/Discord.Net.Rest/Net/Queue/Requests/RestRequest.cs
@@ -1,5 +1,8 @@
using Discord.Net.Rest;
using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Collections.Immutable;
using System.IO;
using System.Threading.Tasks;
@@ -28,7 +31,7 @@ namespace Discord.Net.Queue
public virtual async Task SendAsync()
{
- return await Client.SendAsync(Method, Endpoint, Options.CancelToken, Options.HeaderOnly, Options.AuditLogReason).ConfigureAwait(false);
+ return await Client.SendAsync(Method, Endpoint, Options.CancelToken, Options.HeaderOnly, Options.AuditLogReason, Options.RequestHeaders).ConfigureAwait(false);
}
}
}