事の発端は、昨日 Net::Twitter をupgrade してpostしたらTwitterAPIから "Incorrect Signature" って返ってきてなんじゃらほい ってことから。
とりあえず、Incorrect Signature でぐぐって みたら perlのNet::Twitterを更新したらOAuthで日本語がpostできなくなった という記事を発見。ひとまずNet::Twitterを3.13001に落として様子見。
Net::Twitterの3.13001から3.13003へのdiffを眺めつつそこから呼び出されてるNet::OAuthを眺めつつ。
Net::Twitter で $Net::OAuth::SKIP_UTF8_DOUBLE_ENCODE_CHECK を設定してるけど 当のNet::OAuth側には該当変数のコメントに this is not actually used any more って書いてあるのを発見。(←2重エンコードのチェックは動いてないのかよ
Net::OAuthのコード(Net::OAuth::Message)をよくよく見ると
if ( Encode::is_utf8($str) ) {
$str = Encode::decode_utf8($str, 1);
}
って書いてある。
・・・
ちょっと待て。既にUTF8フラグが立ってて文字列扱いなのに何でさらにデコードすんのん!?
ということで、if の条件を !Encode::is_utf8($str)に変更(↑のコードのすぐ下で URI::Escape::uri_escape_utf8($str)してるからdecode_utf8とencode_utf8の間違いではない)して、
且つNet::Twitter-3.13003 をインストールして 再度post
通った!(ノ・ヮ・ノ
拙い英語で rt.cpan.org にてNet::OAuthにチケット発行。 ← 今ここ
・・・
疲れた。
追記: タイトルのNet::OAuthのバージョンがえらい間違ってたので修正しました。 _o/L