某CMS用に独自のダウンローダが作ってあり、なぜかダウンロードのリクエストが毎回二重に行われる(そして大きなファイルだとそのせいで負荷が増えてしまう)という問題がありました。
非常に謎な動作だったのですが、理由は
- Rangeには対応していないのにAccept-Range付けていた
- Edgeのバグ
という2つの理由でした。理由も二重と。
Rangeには対応していないのにAccept-Range付けていた
HTTPではリクエストで「Range」ヘッダを指定すると、ファイルを部分的にGETすることができます。
例えば
Range: bytes=1000-2000
のように指定すると、該当ファイルの1000byteから2000byteを取得できます。
つまり分割ダウンロードが可能になっています。
ただこれは下記のように、レスポンスの「Accept-Ranges」ヘッダに「bytes」が指定されていて、ファイルが部分的GET可能であることが示されている必要があります。
Accept-Ranges: bytes
このダウンローダでは分割ダウンロード(部分的GET)に対応していないのに、この「Accept-Ranges」が設定されてしまっており、それを見てブラウザが分割ダウンロードをしようとしてきていました。
複数のGETにはそれぞれ「Range」が指定されていたのですが、ダウンローダ側は対応していないため、毎回大きなファイルを全部返してしまっていた、というわけです。
たぶん、ダウンローダを書いた人が参考にしたコードはRange対応になっていたのでしょうが、「Accept-Ranges」の意味を確認せずにそのままコピーしてしまってしまったのではないか、と思います。
Edgeのバグ
EdgeだとPDFのダウンロードリクエストが二重に出てしまう件について、バグらしいということが報告されていました。
- "Microsoft Edge PDF inline issue" Same Issue Again - Stack Overflow
https://stackoverflow.com/questions/31850624/microsoft-edge-pdf-inline-issue-same-issue-again
- Probelm with Edge and ContentType="application/pdf" And content-disposition "inline;filename=report.pdf" | Microsoft Connect
https://connect.microsoft.com/IE/feedback/details/1621308/probelm-with-edge-and-contenttype-application-pdf-and-content-disposition-inline-filename-report-pdf
https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/7045462/
- ruby on rails - Microsoft Edge PDF inline issue - Stack Overflow
https://stackoverflow.com/questions/30918543/microsoft-edge-pdf-inline-issue
簡単にまとめると
- EdgeでPDFのファイルをダウンロードしようとすると二重にリクエストがくる
- 二回目のダウンロードではヘッダにGetContentFeatures.DLNA.ORGが付いてる
- 一度直った(build 10158 2015/7頃)が再発(build 10240 2016/3頃)した
ということだそうです。