Skip to content
This repository was archived by the owner on Apr 10, 2018. It is now read-only.

Commit fb23eb1

Browse files
committed
Fixed HTTP POST OAuth 1.0
1 parent 89229da commit fb23eb1

6 files changed

Lines changed: 150 additions & 90 deletions

File tree

RestSharp.Portable.Core/UrlEscapeUtility.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ internal class UrlEscapeUtility
2525
{ UrlEscapeFlags.AllowAllUnreserved, new HashSet<byte>(UrlUtility.Unreserved) },
2626
{ UrlEscapeFlags.AllowLikeUrlEncode, new HashSet<byte>(UrlUtility.AlphaNum.Union(Encoding.UTF8.GetBytes("-_.!*()"))) },
2727
{ UrlEscapeFlags.AllowLikeEscapeUriString, new HashSet<byte>(UrlUtility.Unreserved.Union(Encoding.UTF8.GetBytes(":&/?+#=$,;@[]"))) },
28-
{ UrlEscapeFlags.AllowLikeWebRequest, new HashSet<byte>(UrlUtility.AlphaNum.Union(Encoding.UTF8.GetBytes("-_.~")).Union(Encoding.UTF8.GetBytes(":"))) },
28+
{ UrlEscapeFlags.AllowLikeWebRequest, new HashSet<byte>(UrlUtility.AlphaNum.Union(Encoding.UTF8.GetBytes("-_.~:"))) },
2929
};
3030

3131
private static readonly Dictionary<UrlEscapeFlags, EscapeBuilderDelegate> s_escapeBuilders = new Dictionary<UrlEscapeFlags, EscapeBuilderDelegate>

RestSharp.Portable.OAuth/OAuth/OAuthTools.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ public static string UrlEncodeRelaxed(string value)
134134
public static string UrlEncodeStrict(string value)
135135
{
136136
// [JD]: We need to escape the apostrophe as well or the signature will fail
137-
return _escapeUtility.Escape(value, _encoding, UrlEscapeFlags.AllowAllUnreserved);
137+
return _escapeUtility.Escape(value, _encoding, UrlEscapeFlags.Default);
138138
}
139139

140140
/// <summary>
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<configuration>
3+
<appSettings>
4+
<add key="tumblr-consumer-id" value="" />
5+
<add key="tumblr-consumer-secret" value="" />
6+
<add key="tumblr-access-token" value="" />
7+
<add key="tumblr-access-secret" value="" />
8+
<add key="tumblr-blog-hostname" value="" />
9+
</appSettings>
10+
<system.net>
11+
<settings>
12+
<httpWebRequest useUnsafeHeaderParsing="true" />
13+
</settings>
14+
</system.net>
15+
</configuration>

RestSharp.Portable.OAuth1.Tests/AuthenticatorTests.cs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Configuration;
23
using System.Linq;
34
using System.Threading;
45
using System.Threading.Tasks;
@@ -7,6 +8,7 @@
78
using RestSharp.Portable.Authenticators.OAuth;
89

910
using Xunit;
11+
using RestSharp.Portable.WebRequest;
1012

1113
namespace RestSharp.Portable.OAuth1.Tests
1214
{
@@ -72,6 +74,41 @@ public async Task ProtectedResourceQuerySimpleUtf8()
7274
Assert.Equal("OAuth oauth_consumer_key=\"consumer-key\",oauth_nonce=\"abcdefghijklmnop\",oauth_signature=\"SIDMGnDWsGNw8XKV9WrrdAgynSE%3D\",oauth_signature_method=\"HMAC-SHA1\",oauth_timestamp=\"1446981133\",oauth_token=\"access-token\",oauth_version=\"1.0\"", (string)header.Value);
7375
}
7476

77+
[Theory]
78+
[InlineData(":/#&?")]
79+
[InlineData("-_.~'")]
80+
[InlineData("!*()")]
81+
[InlineData("=,;$@{}[]")]
82+
public async Task TestTumblr(string text)
83+
{
84+
var consumerId = ConfigurationManager.AppSettings["tumblr-consumer-id"];
85+
var consumerSecret = ConfigurationManager.AppSettings["tumblr-consumer-secret"];
86+
var accessToken = ConfigurationManager.AppSettings["tumblr-access-token"];
87+
var accessSecret = ConfigurationManager.AppSettings["tumblr-access-secret"];
88+
var hostName = ConfigurationManager.AppSettings["tumblr-blog-hostname"];
89+
90+
if (string.IsNullOrEmpty(consumerId)
91+
|| string.IsNullOrEmpty(consumerSecret)
92+
|| string.IsNullOrEmpty(accessToken)
93+
|| string.IsNullOrEmpty(accessSecret)
94+
|| string.IsNullOrEmpty(hostName))
95+
return;
96+
97+
using (var client = new RestClient("https://api.tumblr.com/")
98+
{
99+
Authenticator = OAuth1Authenticator.ForProtectedResource(consumerId, consumerSecret, accessToken, accessSecret),
100+
})
101+
{
102+
var request = new RestRequest("v2/blog/{hostName}/post", Method.POST);
103+
request.AddUrlSegment("hostName", hostName);
104+
request.AddParameter("type", "text");
105+
request.AddParameter("body", text);
106+
107+
var response = await client.Execute(request);
108+
Assert.NotNull(response);
109+
}
110+
}
111+
75112
private static long ToUnixTime(DateTime dateTime)
76113
{
77114
var timeSpan = (dateTime - new DateTime(1970, 1, 1));

RestSharp.Portable.OAuth1.Tests/RestSharp.Portable.OAuth1.Tests.csproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
<Private>True</Private>
4545
</Reference>
4646
<Reference Include="System" />
47+
<Reference Include="System.Configuration" />
4748
<Reference Include="System.Core" />
4849
<Reference Include="System.Xml.Linq" />
4950
<Reference Include="System.Data.DataSetExtensions" />
@@ -75,6 +76,7 @@
7576
<None Include="..\RestSharp.Portable.snk">
7677
<Link>RestSharp.Portable.snk</Link>
7778
</None>
79+
<None Include="App.config" />
7880
<None Include="packages.config" />
7981
</ItemGroup>
8082
<ItemGroup>
@@ -86,6 +88,10 @@
8688
<Project>{3B4CABA1-B3C6-40DD-99E2-4BCE7C35382F}</Project>
8789
<Name>RestSharp.Portable.OAuth.NET45</Name>
8890
</ProjectReference>
91+
<ProjectReference Include="..\RestSharp.Portable.WebRequest.NET45\RestSharp.Portable.WebRequest.NET45.csproj">
92+
<Project>{d9e54193-ce87-4a25-906c-1916bd6d0f5b}</Project>
93+
<Name>RestSharp.Portable.WebRequest.NET45</Name>
94+
</ProjectReference>
8995
</ItemGroup>
9096
<ItemGroup>
9197
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />

RestSharp.Portable.Test/AuthenticationTests.cs

Lines changed: 90 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Configuration;
23
using System.Diagnostics;
34
using System.IO;
45
using System.Linq;
@@ -174,97 +175,98 @@ public async Task TestOAuth10_PlainText(Type factoryType)
174175

175176
private async Task TestOAuth10(IHttpClientFactory httpClientFactory, ISignatureProvider signatureProvider)
176177
{
177-
var client = new RestClient("http://oauthbin.com/v1/")
178+
using (var client = new RestClient("http://oauthbin.com/v1/")
178179
{
179180
HttpClientFactory = httpClientFactory,
180-
};
181-
182-
var consumerKey = "key";
183-
var consumerSecret = "secret";
184-
185-
var authenticator = OAuth1Authenticator.ForRequestToken(consumerKey, consumerSecret, "http://localhost/test");
186-
authenticator.SignatureProvider = signatureProvider;
187-
client.Authenticator = authenticator;
188-
189-
string requestToken, requestTokenSecret;
190-
191-
{
192-
var request = new RestRequest("request-token");
193-
var response = await client.Execute(request);
194-
var requestTokenResponse = Encoding.UTF8.GetString(response.RawBytes);
195-
Assert.DoesNotContain('\n', requestTokenResponse);
196-
197-
var tokenInfo = (from part in requestTokenResponse.Split('&')
198-
let equalSignPos = part.IndexOf('=')
199-
let partKey = part.Substring(0, equalSignPos)
200-
let partValue = part.Substring(equalSignPos + 1)
201-
select new
202-
{
203-
partKey,
204-
partValue
205-
}).ToDictionary(x => x.partKey, x => x.partValue);
206-
207-
Assert.Contains("oauth_token", tokenInfo.Keys);
208-
Assert.Contains("oauth_token_secret", tokenInfo.Keys);
209-
210-
requestToken = tokenInfo["oauth_token"];
211-
requestTokenSecret = tokenInfo["oauth_token_secret"];
212-
}
213-
214-
authenticator = OAuth1Authenticator.ForAccessToken(consumerKey, consumerSecret, requestToken, requestTokenSecret);
215-
authenticator.SignatureProvider = signatureProvider;
216-
client.Authenticator = authenticator;
217-
218-
string accessKey, accessSecret;
219-
220-
{
221-
var request = new RestRequest("access-token");
222-
var response = await client.Execute(request);
223-
var accessTokenResponse = Encoding.UTF8.GetString(response.RawBytes);
224-
Assert.DoesNotContain('\n', accessTokenResponse);
225-
226-
var tokenInfo = (from part in accessTokenResponse.Split('&')
227-
let equalSignPos = part.IndexOf('=')
228-
let partKey = part.Substring(0, equalSignPos)
229-
let partValue = part.Substring(equalSignPos + 1)
230-
select new
231-
{
232-
partKey,
233-
partValue
234-
}).ToDictionary(x => x.partKey, x => x.partValue);
235-
236-
Assert.Contains("oauth_token", tokenInfo.Keys);
237-
Assert.Contains("oauth_token_secret", tokenInfo.Keys);
238-
239-
accessKey = tokenInfo["oauth_token"];
240-
accessSecret = tokenInfo["oauth_token_secret"];
241-
}
242-
243-
authenticator = OAuth1Authenticator.ForProtectedResource(consumerKey, consumerSecret, accessKey, accessSecret);
244-
authenticator.SignatureProvider = signatureProvider;
245-
client.Authenticator = authenticator;
246-
181+
})
247182
{
248-
var request = new RestRequest("echo", Method.POST);
249-
request.AddParameter("one", "1");
250-
request.AddParameter("two", "2");
251-
var response = await client.Execute(request);
252-
var text = Encoding.UTF8.GetString(response.RawBytes);
253-
Assert.DoesNotContain('\n', text);
254-
255-
var data = (from part in text.Split('&')
256-
let equalSignPos = part.IndexOf('=')
257-
let partKey = part.Substring(0, equalSignPos)
258-
let partValue = part.Substring(equalSignPos + 1)
259-
select new
260-
{
261-
partKey,
262-
partValue
263-
}).ToDictionary(x => x.partKey, x => x.partValue);
264-
Assert.Contains("one", data.Keys);
265-
Assert.Contains("two", data.Keys);
266-
Assert.Equal("1", data["one"]);
267-
Assert.Equal("2", data["two"]);
183+
var consumerKey = "key";
184+
var consumerSecret = "secret";
185+
186+
var authenticator = OAuth1Authenticator.ForRequestToken(consumerKey, consumerSecret, "http://localhost/test");
187+
authenticator.SignatureProvider = signatureProvider;
188+
client.Authenticator = authenticator;
189+
190+
string requestToken, requestTokenSecret;
191+
192+
{
193+
var request = new RestRequest("request-token");
194+
var response = await client.Execute(request);
195+
var requestTokenResponse = Encoding.UTF8.GetString(response.RawBytes);
196+
Assert.DoesNotContain('\n', requestTokenResponse);
197+
198+
var tokenInfo = (from part in requestTokenResponse.Split('&')
199+
let equalSignPos = part.IndexOf('=')
200+
let partKey = part.Substring(0, equalSignPos)
201+
let partValue = part.Substring(equalSignPos + 1)
202+
select new
203+
{
204+
partKey,
205+
partValue
206+
}).ToDictionary(x => x.partKey, x => x.partValue);
207+
208+
Assert.Contains("oauth_token", tokenInfo.Keys);
209+
Assert.Contains("oauth_token_secret", tokenInfo.Keys);
210+
211+
requestToken = tokenInfo["oauth_token"];
212+
requestTokenSecret = tokenInfo["oauth_token_secret"];
213+
}
214+
215+
authenticator = OAuth1Authenticator.ForAccessToken(consumerKey, consumerSecret, requestToken, requestTokenSecret);
216+
authenticator.SignatureProvider = signatureProvider;
217+
client.Authenticator = authenticator;
218+
219+
string accessKey, accessSecret;
220+
221+
{
222+
var request = new RestRequest("access-token");
223+
var response = await client.Execute(request);
224+
var accessTokenResponse = Encoding.UTF8.GetString(response.RawBytes);
225+
Assert.DoesNotContain('\n', accessTokenResponse);
226+
227+
var tokenInfo = (from part in accessTokenResponse.Split('&')
228+
let equalSignPos = part.IndexOf('=')
229+
let partKey = part.Substring(0, equalSignPos)
230+
let partValue = part.Substring(equalSignPos + 1)
231+
select new
232+
{
233+
partKey,
234+
partValue
235+
}).ToDictionary(x => x.partKey, x => x.partValue);
236+
237+
Assert.Contains("oauth_token", tokenInfo.Keys);
238+
Assert.Contains("oauth_token_secret", tokenInfo.Keys);
239+
240+
accessKey = tokenInfo["oauth_token"];
241+
accessSecret = tokenInfo["oauth_token_secret"];
242+
}
243+
244+
authenticator = OAuth1Authenticator.ForProtectedResource(consumerKey, consumerSecret, accessKey, accessSecret);
245+
authenticator.SignatureProvider = signatureProvider;
246+
client.Authenticator = authenticator;
247+
248+
{
249+
var request = new RestRequest("echo", Method.POST);
250+
request.AddParameter("one", "1");
251+
request.AddParameter("two", "2");
252+
var response = await client.Execute(request);
253+
var text = Encoding.UTF8.GetString(response.RawBytes);
254+
Assert.DoesNotContain('\n', text);
255+
256+
var data = (from part in text.Split('&')
257+
let equalSignPos = part.IndexOf('=')
258+
let partKey = part.Substring(0, equalSignPos)
259+
let partValue = part.Substring(equalSignPos + 1)
260+
select new
261+
{
262+
partKey,
263+
partValue
264+
}).ToDictionary(x => x.partKey, x => x.partValue);
265+
Assert.Contains("one", data.Keys);
266+
Assert.Contains("two", data.Keys);
267+
Assert.Equal("1", data["one"]);
268+
Assert.Equal("2", data["two"]);
269+
}
268270
}
269271
}
270272
}

0 commit comments

Comments
 (0)