モーグルとカバとパウダーの日記

モーグルやカバ(EXカービング)山スキー(BC)などがメインの日記でした。今は仕事のコンピュータ系のネタが主になっています。以前はスパム対策関連が多かったのですが最近はディープラーニング関連が多めです。

ダウンローダでダウンロードのリクエストが二重に出ていた理由

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のダウンロードリクエストが二重に出てしまう件について、バグらしいということが報告されていました。

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/

https://stackoverflow.com/questions/30918543/microsoft-edge-pdf-inline-issue


簡単にまとめると

  • EdgeでPDFのファイルをダウンロードしようとすると二重にリクエストがくる
  • 二回目のダウンロードではヘッダにGetContentFeatures.DLNA.ORGが付いてる
  • 一度直った(build 10158 2015/7頃)が再発(build 10240 2016/3頃)した

ということだそうです。