AndroidでTitanium.Network.HTTPClientを使うとUAがセットされない

Titanium.Network.HTTPClientで嵌りました。

Yahoo!APIを使ってデータを取ってくる処理を書いていたのですが、iPhoneでは動くのにandroidで動かないという現象が発生しました。

onerrorでエラー内容を見ると「Bad Request」とのこと。

試しにはてなやATNDなどの他のAPIを利用してみると正常にレスポンスが返ってきました。
どうやらなんらかの理由でYahoo!のみBad Requestを返すようです。

TITANIUM BBS(JP UNOFFICIAL)でもらったアドバイスに従ってリクエスト先をローカルのCatalystに変更してヘッダーをダンプしてみると、下記のようにandroidの場合だけUser Agentを送信していないことが分かりました。

#Chrome
$VAR1 = bless( {
                 'accept-charset' => 'Shift_JIS,utf-8;q=0.7,*;q=0.3',
                 'user-agent' => 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.204 Safari/534.16',
                 'connection' => 'keep-alive',
                 'cache-control' => 'max-age=0',
                 'accept' => 'application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5',
                 'accept-language' => 'ja,en-US;q=0.8,en;q=0.6',
                 'accept-encoding' => 'gzip,deflate,sdch',
                 'host' => 'localhost'
               }, 'HTTP::Headers' );

#iOSシミュレータ
$VAR1 = bless( {
                 'user-agent' => 'Appcelerator Titanium/1.6.1 (iPhone Simulator/4.2; iPhone OS; en_US;)',
                 'connection' => 'keep-alive',
                 'accept-encoding' => 'gzip',
                 'x-requested-with' => 'XMLHttpRequest',
                 'host' => 'localhost'
               }, 'HTTP::Headers' );

#androidエミュレーター
$VAR1 = bless( {
                 'user-agent' => '',
                 'connection' => 'Keep-Alive',
                 'x-requested-with' => 'XMLHttpRequest',
                 'host' => 'localhost'
               }, 'HTTP::Headers' );

他にもandroidの場合だけセットされていない値がありましたが、一番怪しいと思われるUserAgentを下記のように自分でセットしてからリクエストを送信すると、ようやくYahoo!からもレスポンスが返ってきました!

xhr.open('GET',url);
xhr.setRequestHeader('User-Agent',Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A537a Safari/419.3');
xhr.send();

ちなみにUAの値は"hoge"とかでも大丈夫だったので、Yahoo!APIはUserAgentに値があるかどうかだけチェックしているようです。

BBSで質問した経緯は下記に。
AndroidでTitanium.Network.createHTTPClient.onloadなどが実行されない

Androidの場合だけTitanium.Network.HTTPClientがUserAgentなどのヘッダをセットしてくれないようです。Yahoo!に限らず、UAをチェックするサービスはたくさんあると思うので気を付けないといけないですね。

TwitterやBBSで返信いただいた@masuidriveさん、@24okさん、ありがとうございました!