一応 前回 の続き
lestrrat さんが RT でつついてくれたお陰もあってか、
昨日(?) Net::OAuth の修正版がリリースされ、
Net::OAuthが変なdecodeをすることはなくなりました。 (0.26以降)
が、その対処方法は 「渡ってきたパラメータを適切にdecodeする」ではなく、
「パラメータは適切にdecodeされていると想定することにする」
つまり 「アプリケーション側でちゃんとdecodeしてから渡してくれよ」 というものでした。
さて、その Net::OAuth を利用している Net::Twitter ですが、
APIメソッドの入り口では頑張って各パラメタのKey/Value に対して utf8::upgrade() してる (Net::Twitter::Core::_prepare_request()/_encode_args()) んだけど、
Net::OAuthにデータを渡すために、HTTP::ResponseやURI を使って
データを整形していくうちに、 肝心のデータが Net::OAuthに渡す直前には
UTF-8 octets になってしまっていました。(Net::Twitter::Core::_prepare_request() -> Net::Twitter::Role::OAuth::_add_authorization_header()/_make_oauth_request() )
# URIの方はあまり調べてないですが、少なくともHTTP::Response(のベースクラスであるHTTP::Message) は、扱うデータとして octet sequence (podでは string in bytes って書いてある)を要求しているし、decoded string が来た場合はわざわざ utf8::downgrade() してる。
当然、Net::OAuth は間違ったデータでもってsignatureを作成し、結果、日本語を含むpostを投げると 前回のと同様、 twitterサーバから 401 が返ってくることになります。
という問題を解決するためのパッチを作って RTで報告しておきました ので、よろしく(何





コメントする