Skip to content

Commit 0b2f1dd

Browse files
committed
Merge remote-tracking branch 'origin/dev' into dev
2 parents 7969b01 + 49ce028 commit 0b2f1dd

25 files changed

+336
-252
lines changed

src/RestSharp/Authenticators/AuthenticatorBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ namespace RestSharp.Authenticators;
1717
public abstract class AuthenticatorBase : IAuthenticator {
1818
protected AuthenticatorBase(string token) => Token = token;
1919

20-
protected string Token { get; }
20+
protected string Token { get; set; }
2121

2222
protected abstract ValueTask<Parameter> GetAuthenticationParameter(string accessToken);
2323

src/RestSharp/Authenticators/HttpBasicAuthenticator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,5 +35,5 @@ static string GetHeader(string username, string password, Encoding encoding)
3535

3636
// return ;
3737
protected override ValueTask<Parameter> GetAuthenticationParameter(string accessToken)
38-
=> new(new Parameter("Authorization", $"Basic {accessToken}", ParameterType.HttpHeader));
38+
=> new(new Parameter(KnownHeaders.Authorization, $"Basic {accessToken}", ParameterType.HttpHeader, false));
3939
}

src/RestSharp/Authenticators/JwtAuthenticator.cs

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,21 +18,18 @@ namespace RestSharp.Authenticators;
1818
/// JSON WEB TOKEN (JWT) Authenticator class.
1919
/// <remarks>https://tools.ietf.org/html/draft-ietf-oauth-json-web-token</remarks>
2020
/// </summary>
21-
public class JwtAuthenticator : IAuthenticator {
22-
string _authHeader = null!;
23-
24-
// ReSharper disable once IntroduceOptionalParameters.Global
25-
public JwtAuthenticator(string accessToken) => SetBearerToken(accessToken);
21+
public class JwtAuthenticator : AuthenticatorBase {
22+
public JwtAuthenticator(string accessToken) : base(GetToken(accessToken)) { }
2623

2724
/// <summary>
2825
/// Set the new bearer token so the request gets the new header value
2926
/// </summary>
3027
/// <param name="accessToken"></param>
3128
[PublicAPI]
32-
public void SetBearerToken(string accessToken) => _authHeader = $"Bearer {Ensure.NotEmpty(accessToken, nameof(accessToken))}";
29+
public void SetBearerToken(string accessToken) => Token = GetToken(accessToken);
30+
31+
static string GetToken(string accessToken) => $"Bearer {Ensure.NotEmpty(accessToken, nameof(accessToken))}";
3332

34-
public ValueTask Authenticate(RestClient client, RestRequest request) {
35-
request.AddOrUpdateParameter("Authorization", _authHeader, ParameterType.HttpHeader);
36-
return default;
37-
}
33+
protected override ValueTask<Parameter> GetAuthenticationParameter(string accessToken)
34+
=> new(new Parameter(KnownHeaders.Authorization, accessToken, ParameterType.HttpHeader, false));
3835
}

src/RestSharp/Authenticators/OAuth/OAuth1Authenticator.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,9 @@ public class OAuth1Authenticator : IAuthenticator {
4040

4141
public ValueTask Authenticate(RestClient client, RestRequest request) {
4242
var workflow = new OAuthWorkflow {
43-
ConsumerKey = ConsumerKey,
44-
ConsumerSecret = ConsumerSecret,
45-
// ParameterHandling = ParameterHandling,
43+
ConsumerKey = ConsumerKey,
44+
ConsumerSecret = ConsumerSecret,
45+
ParameterHandling = ParameterHandling,
4646
SignatureMethod = SignatureMethod,
4747
SignatureTreatment = SignatureTreatment,
4848
Verifier = Verifier,
@@ -191,7 +191,7 @@ public static OAuth1Authenticator ForProtectedResource(
191191
};
192192

193193
void AddOAuthData(RestClient client, RestRequest request, OAuthWorkflow workflow) {
194-
var requestUrl = client.BuildUriWithoutQueryParameters(request);
194+
var requestUrl = client.BuildUriWithoutQueryParameters(request).AbsoluteUri;
195195

196196
if (requestUrl.Contains('?'))
197197
throw new ApplicationException(
@@ -233,7 +233,7 @@ void AddOAuthData(RestClient client, RestRequest request, OAuthWorkflow workflow
233233
OAuthType.AccessToken => workflow.BuildAccessTokenSignature(method, parameters),
234234
OAuthType.ClientAuthentication => workflow.BuildClientAuthAccessTokenSignature(method, parameters),
235235
OAuthType.ProtectedResource => workflow.BuildProtectedResourceSignature(method, parameters, url),
236-
_ => throw new ArgumentOutOfRangeException()
236+
_ => throw new ArgumentOutOfRangeException(nameof(Type))
237237
};
238238

239239
oauth.Parameters.Add("oauth_signature", oauth.Signature);
@@ -242,13 +242,13 @@ void AddOAuthData(RestClient client, RestRequest request, OAuthWorkflow workflow
242242
OAuthParameterHandling.HttpAuthorizationHeader => CreateHeaderParameters(),
243243
OAuthParameterHandling.UrlOrPostParameters => CreateUrlParameters(),
244244
_ =>
245-
throw new ArgumentOutOfRangeException()
245+
throw new ArgumentOutOfRangeException(nameof(ParameterHandling))
246246
};
247247

248248
request.AddOrUpdateParameters(oauthParameters);
249249

250250
IEnumerable<Parameter> CreateHeaderParameters()
251-
=> new[] { new Parameter("Authorization", GetAuthorizationHeader(), ParameterType.HttpHeader) };
251+
=> new[] { new Parameter(KnownHeaders.Authorization, GetAuthorizationHeader(), ParameterType.HttpHeader) };
252252

253253
IEnumerable<Parameter> CreateUrlParameters()
254254
=> oauth.Parameters.Select(p => new Parameter(p.Name, HttpUtility.UrlDecode(p.Value), ParameterType.GetOrPost));

src/RestSharp/Authenticators/OAuth/OAuthWorkflow.cs

Lines changed: 18 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414

1515
using System.Web;
1616
using RestSharp.Authenticators.OAuth.Extensions;
17-
using RestSharp.Extensions;
1817

1918
namespace RestSharp.Authenticators.OAuth;
2019

@@ -32,11 +31,11 @@ sealed class OAuthWorkflow {
3231
public string? SessionHandle { get; set; }
3332
public OAuthSignatureMethod SignatureMethod { get; set; }
3433
public OAuthSignatureTreatment SignatureTreatment { get; set; }
35-
// public OAuthParameterHandling ParameterHandling { get; set; }
36-
public string? ClientUsername { get; set; }
37-
public string? ClientPassword { get; set; }
38-
public string? RequestTokenUrl { get; set; }
39-
public string? AccessTokenUrl { get; set; }
34+
public OAuthParameterHandling ParameterHandling { get; set; }
35+
public string? ClientUsername { get; set; }
36+
public string? ClientPassword { get; set; }
37+
public string? RequestTokenUrl { get; set; }
38+
public string? AccessTokenUrl { get; set; }
4039

4140
/// <summary>
4241
/// Generates an OAuth signature to pass to an
@@ -169,32 +168,24 @@ void ValidateProtectedResourceState() {
169168
Ensure.NotEmpty(ConsumerKey, nameof(ConsumerKey));
170169
}
171170

172-
WebPairCollection GenerateAuthParameters(string timestamp, string nonce) {
173-
var authParameters = new WebPairCollection {
174-
new("oauth_consumer_key", Ensure.NotNull(ConsumerKey, nameof(ConsumerKey))),
175-
new("oauth_nonce", nonce),
176-
new("oauth_signature_method", SignatureMethod.ToRequestValue()),
177-
new("oauth_timestamp", timestamp),
178-
new("oauth_version", Version ?? "1.0")
179-
};
180-
181-
if (!Token.IsEmpty()) authParameters.Add(new WebPair("oauth_token", Token!, true));
182-
183-
if (!CallbackUrl.IsEmpty()) authParameters.Add(new WebPair("oauth_callback", CallbackUrl!, true));
184-
185-
if (!Verifier.IsEmpty()) authParameters.Add(new WebPair("oauth_verifier", Verifier!));
186-
187-
if (!SessionHandle.IsEmpty()) authParameters.Add(new WebPair("oauth_session_handle", SessionHandle!));
188-
189-
return authParameters;
190-
}
171+
WebPairCollection GenerateAuthParameters(string timestamp, string nonce)
172+
=> new WebPairCollection {
173+
new("oauth_consumer_key", Ensure.NotNull(ConsumerKey, nameof(ConsumerKey)), true),
174+
new("oauth_nonce", nonce),
175+
new("oauth_signature_method", SignatureMethod.ToRequestValue()),
176+
new("oauth_timestamp", timestamp),
177+
new("oauth_version", Version ?? "1.0")
178+
}.AddNotEmpty("oauth_token", Token!, true)
179+
.AddNotEmpty("oauth_callback", CallbackUrl!, true)
180+
.AddNotEmpty("oauth_verifier", Verifier!)
181+
.AddNotEmpty("oauth_session_handle", SessionHandle!);
191182

192183
WebPairCollection GenerateXAuthParameters(string timestamp, string nonce)
193-
=> new() {
184+
=> new WebPairCollection {
194185
new("x_auth_username", Ensure.NotNull(ClientUsername, nameof(ClientUsername))),
195186
new("x_auth_password", Ensure.NotNull(ClientPassword, nameof(ClientPassword))),
196187
new("x_auth_mode", "client_auth"),
197-
new("oauth_consumer_key", Ensure.NotNull(ConsumerKey, nameof(ConsumerKey))),
188+
new("oauth_consumer_key", Ensure.NotNull(ConsumerKey, nameof(ConsumerKey)), true),
198189
new("oauth_signature_method", SignatureMethod.ToRequestValue()),
199190
new("oauth_timestamp", timestamp),
200191
new("oauth_nonce", nonce),

src/RestSharp/Authenticators/OAuth/WebPairCollection.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,12 @@ class WebPairCollection : IList<WebPair> {
2828
public void AddRange(IEnumerable<WebPair> collection) => AddCollection(collection);
2929

3030
public void Add(string name, string value) => Add(new WebPair(name, value));
31+
32+
public WebPairCollection AddNotEmpty(string name, string? value, bool encode = false) {
33+
if (value != null)
34+
Add(new WebPair(name, value, encode));
35+
return this;
36+
}
3137

3238
public void Clear() => _parameters.Clear();
3339

src/RestSharp/Authenticators/OAuth2/OAuth2AuthorizationRequestHeaderAuthenticator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,5 +38,5 @@ public OAuth2AuthorizationRequestHeaderAuthenticator(string accessToken)
3838
public OAuth2AuthorizationRequestHeaderAuthenticator(string accessToken, string tokenType) : base(accessToken) => _tokenType = tokenType;
3939

4040
protected override ValueTask<Parameter> GetAuthenticationParameter(string accessToken)
41-
=> new(new Parameter("Authorization", $"{_tokenType} {accessToken}", ParameterType.HttpHeader));
41+
=> new(new Parameter(KnownHeaders.Authorization, $"{_tokenType} {accessToken}", ParameterType.HttpHeader));
4242
}

src/RestSharp/KnownHeaders.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
namespace RestSharp;
1919

2020
public static class KnownHeaders {
21+
public const string Authorization = "Authorization";
2122
public const string Accept = "Accept";
2223
public const string Allow = "Allow";
2324
public const string Expires = "Expires";

src/RestSharp/Parameters/Parameter.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,6 @@ public Parameter(string name, object value, string contentType, ParameterType ty
6666
/// </summary>
6767
/// <returns>String</returns>
6868
public override string ToString() => $"{Name}={Value}";
69-
7069
}
7170

7271
public record XmlParameter : Parameter {
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
// Copyright © 2009-2020 John Sheehan, Andrew Young, Alexey Zimarev and RestSharp community
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
//
15+
16+
using System.Collections;
17+
using System.Collections.Concurrent;
18+
using RestSharp.Authenticators.OAuth.Extensions;
19+
20+
namespace RestSharp;
21+
22+
public class ParametersCollection : IReadOnlyCollection<Parameter> {
23+
readonly List<Parameter> _parameters = new();
24+
25+
public ParametersCollection() { }
26+
27+
public ParametersCollection(IEnumerable<Parameter> parameters) => _parameters.AddRange(parameters);
28+
29+
public ParametersCollection AddParameters(IEnumerable<Parameter> parameters) {
30+
_parameters.AddRange(parameters);
31+
return this;
32+
}
33+
34+
public ParametersCollection AddParameters(ParametersCollection parameters) {
35+
_parameters.AddRange(parameters);
36+
return this;
37+
}
38+
39+
public void AddParameter(Parameter parameter) => _parameters.Add(parameter);
40+
41+
public void RemoveParameter(string name) => _parameters.RemoveAll(x => x.Name == name);
42+
43+
public void RemoveParameter(Parameter parameter) => _parameters.Remove(parameter);
44+
45+
public bool Exists(Parameter parameter)
46+
=> _parameters.Any(
47+
p => p.Name != null && p.Name.Equals(parameter.Name, StringComparison.InvariantCultureIgnoreCase) && p.Type == parameter.Type
48+
);
49+
50+
public Parameter? TryFind(string parameterName) => _parameters.FirstOrDefault(x => x.Name != null && x.Name.EqualsIgnoreCase(parameterName));
51+
52+
internal ParametersCollection GetParameters(ParameterType parameterType) => new(_parameters.Where(x => x.Type == parameterType));
53+
54+
internal ParametersCollection GetQueryParameters(Method method)
55+
=> new(
56+
method is not Method.Post and not Method.Put and not Method.Patch
57+
? _parameters
58+
.Where(
59+
p => p.Type is ParameterType.GetOrPost or ParameterType.QueryString
60+
)
61+
: _parameters
62+
.Where(
63+
p => p.Type is ParameterType.QueryString
64+
)
65+
);
66+
67+
public IEnumerator<Parameter> GetEnumerator() => _parameters.GetEnumerator();
68+
69+
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
70+
71+
public int Count => _parameters.Count;
72+
}

0 commit comments

Comments
 (0)