推測する必要がある場合、違いは Apache 静的ファイル サービスと hgweb が提供するヘッダーにあると言えます。Apache の静的ファイル サービスからの .mp3 ファイルの出力は次のとおりです。
$ HEAD -Ssed http://sgdk2.enigmadream.com/ben/iotaBuildIt/bing.mp3
HEAD http://sgdk2.enigmadream.com/ben/iotaBuildIt/bing.mp3
200 OK
Connection: close
Date: Wed, 23 May 2012 16:55:03 GMT
Accept-Ranges: bytes
ETag: "4d0cbbe-16c7-4bd83a906c040"
Server: Apache
Content-Length: 5831
Content-Type: audio/mpeg
Last-Modified: Thu, 12 Apr 2012 23:24:41 GMT
ここでは、hgweb の raw-files ハンドラーからのものです。
HEAD http://hg.code.sf.net/u/bluemonkmn/myiota/raw-file/97ac02a717fe/HTML/bing.mp3
200 Script output follows
Connection: close
Date: Wed, 23 May 2012 16:56:33 GMT
Server: Apache/2.2.3 (CentOS)
Content-Length: 5831
Content-Type: audio/mpeg
Content-Disposition: inline; filename="bing.mp3"
大きな違いは、Apache がAccept-Rangesヘッダーを含み、hgweb がContent-Dispositionヘッダーを提供することです。
ここのContent-Disposition
ヘッダーは、saveAs のデフォルトのファイル名をブラウザに提示するだけなので、おそらく原因ではありません (ただし、原因はわかりません)。
ヘッダーはAccept-Ranges
もっと面白いです。本来の目的ではありませんが、ストリーミング オーディオとビデオの再生を求めるバックボーンになっています。再生をシークの特殊なケース (ゼロへのシーク)と考える場合、Chrome はそれを無効にしている可能性があります。これは、Accept-Ranges
ヘッダーがないとまったくシークできないと考えているためです (もちろん、ゼロへのシークは単に再生しているだけです)。またゼロから)。
それは間違いなくただの唾吐きですが、テストするのは簡単です. 次のようにmod_headersを使用するように hgweb の apache ホストを微調整します。
header add Accept-Ranges bytes
あなたを実行しているパスhgweb
(wsgiでもcgiでも)。Content-Disposition
ヘッダーを削除することもできmod_headers
ます。
最終的には、ネットワーク上のバイトがすべてです。hgweb と Apache がまったく同じバイトを返すようにすると、Chromeはそれを同じように処理します。
注:もちろん、Accept-Ranges: bytes
hgweb の出力にヘッダーを追加しても、実際には hgweb にバイト範囲サポートが追加されない場合がありますが、それは問題ありません。hgweb はRange: bytes=xxxx
ヘッダーを無視するだけで、206 Partial Response
ステータスを返す代わりに a を返し200 OK
ます。RFC によると、クライアント (Chrome) で処理する必要があります。そのため、ファイルをスキップすることはできませんが、Chrome でシークして開始/再生できるようにするだけで十分な場合があります。