Skip to content

Commit 63daee1

Browse files
committed
Fixes #2065
1 parent ba07441 commit 63daee1

File tree

3 files changed

+35
-13
lines changed

3 files changed

+35
-13
lines changed

src/RestSharp/Authenticators/OAuth/OAuth1Auth.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -237,11 +237,11 @@ void AddOAuthData(IRestClient client, RestRequest request, OAuthWorkflow workflo
237237
var oauthParameters = ParameterHandling switch {
238238
OAuthParameterHandling.HttpAuthorizationHeader => CreateHeaderParameters(),
239239
OAuthParameterHandling.UrlOrPostParameters => CreateUrlParameters(),
240-
_ =>
241-
throw new ArgumentOutOfRangeException(nameof(ParameterHandling))
240+
_ => throw new ArgumentOutOfRangeException(nameof(ParameterHandling))
242241
};
243242

244243
request.AddOrUpdateParameters(oauthParameters);
244+
return;
245245

246246
IEnumerable<Parameter> CreateHeaderParameters() => new[] { new HeaderParameter(KnownHeaders.Authorization, GetAuthorizationHeader()) };
247247

@@ -264,4 +264,4 @@ string GetAuthorizationHeader() {
264264
static class ParametersExtensions {
265265
internal static IEnumerable<WebPair> ToWebParameters(this IEnumerable<Parameter> p)
266266
=> p.Select(x => new WebPair(Ensure.NotNull(x.Name, "Parameter name"), x.Value?.ToString()));
267-
}
267+
}

src/RestSharp/Authenticators/OAuth/OAuthTools.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -93,20 +93,20 @@ public static string GetNonce() {
9393
public static string? UrlEncodeRelaxed(string? value) {
9494
if (value == null) return null;
9595

96+
// Do RFC 2396 escaping by calling the .NET method to do the work.
97+
var escaped = Uri.EscapeDataString(value);
98+
9699
// Escape RFC 3986 chars first.
97-
var escapedRfc3986 = new StringBuilder(value);
100+
var escapedRfc3986 = new StringBuilder(escaped);
98101

99102
for (var i = 0; i < UriRfc3986CharsToEscape.Length; i++) {
100103
var t = UriRfc3986CharsToEscape[i];
101104

102105
escapedRfc3986.Replace(t, UriRfc3968EscapedHex[i]);
103106
}
104107

105-
// Do RFC 2396 escaping by calling the .NET method to do the work.
106-
var escapedRfc2396 = Uri.EscapeDataString(escapedRfc3986.ToString());
107-
108108
// Return the fully-RFC3986-escaped string.
109-
return escapedRfc2396;
109+
return escapedRfc3986.ToString();
110110
}
111111

112112
/// <summary>

test/RestSharp.Tests/Auth/OAuth1AuthTests.cs

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public void Authenticate_ShouldAddAuthorizationAsTextValueToRequest_OnHttpAuthor
2727
const string url = "https://no-query.string";
2828

2929
using var client = new RestClient(url);
30-
var request = new RestRequest();
30+
var request = new RestRequest();
3131

3232
_auth.ParameterHandling = OAuthParameterHandling.HttpAuthorizationHeader;
3333

@@ -57,7 +57,7 @@ public void Authenticate_ShouldAddSignatureToRequestAsSeparateParameters_OnUrlOr
5757
const string url = "https://no-query.string";
5858

5959
using var client = new RestClient(url);
60-
var request = new RestRequest();
60+
var request = new RestRequest();
6161
request.AddQueryParameter("queryparameter", "foobartemp");
6262

6363
_auth.ParameterHandling = OAuthParameterHandling.UrlOrPostParameters;
@@ -98,7 +98,7 @@ public void Authenticate_ShouldEncodeOAuthTokenParameter(OAuthType type, string
9898
const string url = "https://no-query.string";
9999

100100
using var client = new RestClient(url);
101-
var request = new RestRequest();
101+
var request = new RestRequest();
102102
_auth.Type = type;
103103
_auth.Token = value;
104104

@@ -125,7 +125,7 @@ public void Authenticate_ShouldAllowEmptyConsumerSecret_OnHttpAuthorizationHeade
125125
const string url = "https://no-query.string";
126126

127127
using var client = new RestClient(url);
128-
var request = new RestRequest();
128+
var request = new RestRequest();
129129
_auth.Type = type;
130130
_auth.ConsumerSecret = null;
131131

@@ -141,4 +141,26 @@ public void Authenticate_ShouldAllowEmptyConsumerSecret_OnHttpAuthorizationHeade
141141
Assert.Contains("OAuth", value!);
142142
Assert.Contains($"oauth_signature=\"{OAuthTools.UrlEncodeStrict("&")}", value);
143143
}
144-
}
144+
145+
[Fact]
146+
public async Task Authenticate_ShouldUriEncodeConsumerKey_OnHttpAuthorizationHeaderHandling() {
147+
// Arrange
148+
const string url = "https://no-query.string";
149+
150+
var client = new RestClient(url);
151+
var request = new RestRequest();
152+
_auth.Type = OAuthType.ProtectedResource;
153+
_auth.ConsumerKey = "my@consumer!key";
154+
_auth.ConsumerSecret = null;
155+
156+
// Act
157+
await _auth.Authenticate(client, request);
158+
159+
// Assert
160+
var authParameter = request.Parameters.Single(x => x.Name == KnownHeaders.Authorization);
161+
var value = (string)authParameter.Value;
162+
163+
value.Should().Contain("OAuth");
164+
value.Should().Contain("oauth_consumer_key=\"my%40consumer%21key");
165+
}
166+
}

0 commit comments

Comments
 (0)