|
1 | 1 | using System; |
2 | 2 | using System.Collections.Generic; |
| 3 | +using System.Linq; |
3 | 4 | using System.Net.Http; |
4 | 5 | using System.Net.Http.Headers; |
5 | 6 | using System.Security.Cryptography; |
6 | 7 | using System.Text; |
7 | 8 | using System.Threading.Tasks; |
| 9 | +using System.Web; |
| 10 | +using TinyOAuth1.Utility; |
8 | 11 |
|
9 | 12 | namespace TinyOAuth1 |
10 | 13 | { |
@@ -95,7 +98,7 @@ As the HTTP POST request body with a content-type of application/x-www-form-urle |
95 | 98 | Added to the URLs in the query part (as defined by [RFC3986] section 3). |
96 | 99 | In addition to these defined methods, future extensions may describe alternate methods for sending the OAuth Protocol Parameters. The methods for sending other request parameters are left undefined, but SHOULD NOT use the OAuth HTTP Authorization Scheme header. |
97 | 100 |
|
98 | | - */ |
| 101 | + */ |
99 | 102 |
|
100 | 103 | /* 5.4.1. Authorization Header |
101 | 104 |
|
@@ -267,30 +270,19 @@ No additional Service Provider specific parameters are allowed when requesting a |
267 | 270 |
|
268 | 271 | if (!string.IsNullOrEmpty(responseText)) |
269 | 272 | { |
270 | | - string oauthToken = null; |
271 | | - string oauthTokenSecret = null; |
272 | | - var keyValPairs = responseText.Split('&'); |
| 273 | + var keyValPairs = HttpUtility.ParseQueryString(responseText); |
273 | 274 |
|
274 | | - for (var i = 0; i < keyValPairs.Length; i++) |
275 | | - { |
276 | | - var splits = keyValPairs[i].Split('='); |
277 | | - switch (splits[0]) |
278 | | - { |
279 | | - case "oauth_token": |
280 | | - oauthToken = splits[1]; |
281 | | - break; |
282 | | - case "oauth_token_secret": |
283 | | - oauthTokenSecret = splits[1]; |
284 | | - break; |
285 | | - } |
286 | | - } |
| 275 | + var oauthToken = keyValPairs.GetValues("oauth_token")?.SingleOrDefault(); |
| 276 | + var oauthTokenSecret = keyValPairs.GetValues("oauth_token_secret")?.SingleOrDefault(); |
287 | 277 |
|
288 | 278 | return new AccessTokenInfo |
289 | 279 | { |
290 | 280 | AccessToken = oauthToken, |
291 | | - AccessTokenSecret = oauthTokenSecret |
| 281 | + AccessTokenSecret = oauthTokenSecret, |
| 282 | + AdditionalParams = keyValPairs.ToDictionary() |
292 | 283 | }; |
293 | 284 | } |
| 285 | + |
294 | 286 | throw new Exception("Empty response text when getting the access token"); |
295 | 287 | } |
296 | 288 |
|
@@ -342,36 +334,21 @@ public async Task<RequestTokenInfo> GetRequestTokenAsync() |
342 | 334 | // oauth_token_secret: |
343 | 335 | //The Token Secret. |
344 | 336 |
|
345 | | - string oauthToken = null; |
346 | | - string oauthTokenSecret = null; |
347 | 337 | //string oauthAuthorizeUrl = null; |
348 | 338 |
|
349 | | - var keyValPairs = responseText.Split('&'); |
| 339 | + var keyValPairs = HttpUtility.ParseQueryString(responseText); |
350 | 340 |
|
351 | | - for (var i = 0; i < keyValPairs.Length; i++) |
352 | | - { |
353 | | - var splits = keyValPairs[i].Split('='); |
354 | | - switch (splits[0]) |
355 | | - { |
356 | | - case "oauth_token": |
357 | | - oauthToken = splits[1]; |
358 | | - break; |
359 | | - case "oauth_token_secret": |
360 | | - oauthTokenSecret = splits[1]; |
361 | | - break; |
362 | | - // TODO: Handle this one? |
363 | | - //case "xoauth_request_auth_url": |
364 | | - // oauthAuthorizeUrl = splits[1]; |
365 | | - // break; |
366 | | - } |
367 | | - } |
| 341 | + var oauthToken = keyValPairs.GetValues("oauth_token")?.SingleOrDefault(); |
| 342 | + var oauthTokenSecret = keyValPairs.GetValues("oauth_token_secret")?.SingleOrDefault(); |
368 | 343 |
|
369 | 344 | return new RequestTokenInfo |
370 | 345 | { |
371 | 346 | RequestToken = oauthToken, |
372 | | - RequestTokenSecret = oauthTokenSecret |
| 347 | + RequestTokenSecret = oauthTokenSecret, |
| 348 | + AdditionalParams = keyValPairs.ToDictionary() |
373 | 349 | }; |
374 | 350 | } |
| 351 | + |
375 | 352 | throw new Exception("Empty response text when getting the request token"); |
376 | 353 | } |
377 | 354 |
|
|
0 commit comments