Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Url with a space or special characters #9

Open
cmorgado opened this issue Jan 7, 2014 · 3 comments
Open

Url with a space or special characters #9

cmorgado opened this issue Jan 7, 2014 · 3 comments

Comments

@cmorgado
Copy link

cmorgado commented Jan 7, 2014

I'm using the library with success , but if my Url has a space or a special character then my API provider gives me an unautorized

https://api-content.meocloud.pt/1/Metadata/meocloud/novapasta
OK

https://api-content.meocloud.pt/1/Metadata/meocloud/nova com espaco/
NOK - UNAUTHORIZED

https://api-content.meocloud.pt/1/Metadata/meocloud/cão/

@neuecc
Copy link
Owner

neuecc commented Jan 8, 2014

hmn,
Why don't you escape a URL ?

Uri.EscapeUriString("https://api-content.meocloud.pt/1/Metadata/meocloud/nova com espaco/")

@cmorgado
Copy link
Author

cmorgado commented Jan 8, 2014

That was my first attempt :(

client = OAuthUtility.CreateOAuthClient(ConsumerKey, ConsumerSecret, new AccessToken(AccessToken, AccessTokenSecret));

HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, new Uri(Uri.EscapeUriString("https://api-content.meocloud.pt/1/Metadata/meocloud/nova com espaco/"), UriKind.RelativeOrAbsolute));
var response = await client.SendAsync(request);

(I hard coded the url for demostration purpose... )

@Mizutama
Copy link

たぶん同じことが起きて、現物合わせで直ってるっぽくなったのでこちらに書かせていただきます。
自作Twitterクライアントにて使わせていただいているのですが、
searchAPIに「#セイレン filter:images」を投げようとすると認証が失敗する。
でも「#セイレン」や「#seiren filter:images」はちゃんと成功する、というわけのわかんないトラブルに遭遇しました。
同じことをTwitter API Consoleで試すと問題ないので調べたらsignature base stringがいけないことが判りました。
(GoogleCode OAuthBase.csのGenerateSignatureBase()経由にすると認証が通ったので比較した)

でいけない原因は

リクエストするurl(パラメーター)
q=%23%E3%82%BB%E3%82%A4%E3%83%AC%E3%83%B3%20filter%3Aimages&result_type=recent&count=100

OAuthMessageHandlerのSendAsyncオーバーライドのHttpRequestMessage
RequestUri.OrigianlString
https://api.twitter.com/1.1/search/tweets.json?q=%23%E3%82%BB%E3%82%A4%E3%83%AC%E3%83%B3%20filter%3Aimages&result_type=recent&count=100
リクエストと同じ

OAuthUtility.GenerateSignatureのuriパラメーター
OriginalString https://api.twitter.com/1.1/search/tweets.json?q=%23%E3%82%BB%E3%82%A4%E3%83%AC%E3%83%B3%20filter%3Aimages&result_type=recent&count=100
リクエストと同じ

Utility.ParseQueryStringのqueryパラメーター
?q=%23%E3%82%BB%E3%82%A4%E3%83%AC%E3%83%B3%20filter:images&result_type=recent&count=100
%3Aが:に化けて渡ってくる
しかし?q=%23seiren%20filter%3Aimages&result_type=recent&count=100だと化けない
そして化けた方でメッセージダイジェストを作らないと認証が失敗する

と、原因が掴めたけど理由がまだ判っていません。

以下のように変更したら動作したので暫定対策としました。

    Utility.ParseQueryString()
    else
    {
       //return new KeyValuePair<string , string>( xs[0].UrlDecode() , xs[1].UrlDecode() );
       return new KeyValuePair<string , string>( xs[0] , xs[1] );
    }

    OAuthUtility.GenerateSignature()
    var stringParameter = parameters.Where( x => x.Key.ToLower() != "realm" )
                                    .Concat( queryParams )
                                    //.Select( p => new { Key = p.Key.UrlEncode() , Value = p.Value.UrlEncode() } )
                                    .OrderBy( p => p.Key , StringComparer.Ordinal )
                                    .ThenBy( p => p.Value , StringComparer.Ordinal )
                                    .Select( p => p.Key + "=" + p.Value )
                                    .ToString( "&" );

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants