Posted by & filed under server.


自宅の無線LANに接続している時に、Webページ内に埋め込まれているYouTubeが読み込まれていないことに気がついた。

YouTubeアプリを起動してみると、

YouTubeを利用できません

と出てくる。3G回線で試してみると、そんなことはない。

前まではそんなことはなかったのに、何でだろうかと考えてみたら、最近iPhoneでもプロキシを通して接続してることを思い出した。

プロキシの設定をOFFにしてみると、きちんと読み込めた。どうやらプロキシが原因っぽい。

原因を見つけるために、ログを取ることにした。

Squid で通信プロトコルの詳細ログを取るときは、 squid.conf を次の様に設定する。

cache_log /var/log/squid/cache.log
debug_options 33,8

debug_options の後ろの数字は詳細度。1から9までで設定でき、値が大きければ大きいほど詳細なログを取る。

大量のログを吐き出すので、やることが済んだらコメントアウトしておく事。

設定を変更して squid を restart したら、YouTubeアプリを開いて通信させてみる。

その後、 cache.log を開いて、怪しいところを調べる。

発見した怪しげなところ。

2010/02/17 15:35:51| parseHttpRequest: Method is 'GET'
2010/02/17 15:35:51| parseHttpRequest: URI is 'http://iphone-wu.apple.com/feeds/api/standardfeeds/JP/recently_featured?start-index=1&max-results=25'
2010/02/17 15:35:51| parseHttpRequest: req_hdr = {User-Agent: Apple iPhone v3.1.3 YouTube v1.0.0.7E18
Accept-Language: ja-jp, *;q=0.5
Gdata-Version: 2
X-Gdata-Client: ytapi-apple-iphone
Host: gdata.youtube.com
X-Youtube-Deviceauthtoken: *****
Accept: */*
Accept-Encoding: gzip, deflate
Cookie: *****
Pragma: no-cache
Connection: keep-alive
Proxy-Connection: keep-alive

}

YouTubeアプリが変なリクエストヘッダを送っている事が分かる。

GETするコンテンツのホスト名は “iphone-wu.apple.com” になっているのに、リクエストヘッダ内の Host には “gdata.youtube.com” となっている。

すなわち、実際に取得するコンテンツのホスト名は、 “gdata.youtube.com” ということになる。なぜか、わざわざ “iphone-wu.apple.com” を経由させる形になっている。

何でこんな事をしてるのか…? 理由が分からない。 何か利点があるのかな??

とにかく、このへんてこなリクエストのせいで、 Squid が混乱してる模様。”通信できない”と表示される事から、恐らく Squid がリクエストを書き換えて、結果、402 になり、表示できないのだろう。

パッと思いつく対処方法は、自動構成スクリプトを書く事。

幸い、iPhone は自動構成スクリプトに対応しているので、iPhone用のスクリプトを書いてみた。

・iphone.pac

function FindProxyForURL(url, host)
{
    if (host == "iphone-wu.apple.com")
        return "DIRECT";
    else
        return "PROXY 10.0.0.10:8080";
}

iphone-wu.apple.com 宛のリクエストの場合は直接接続(DIRECT)、それ以外の場合はプロキシを通して接続するように設定する。

これでうまくいったので、解決ということにする。

.

それにしても、なんであんな変なリクエストを送るのか…

あれって、RFC的にはどうなの? 教えてエロい人!