部分的GET

HTTP/1.1にはリソースの一部だけを要求する部分的GETというのがあります。
部分的GETではリクエストに次のようなRangeヘッダというのが使われます。

Range:bytes=0-499

これを受け取ったWebサーバーはレスポンスに次のようなContent-Rangeヘッダを付加してリソースの一部を返します。

Content-Range:bytes 0-499/1234

リクエスト時のRangeヘッダは複数ある場合があり、その場合のレスポンスはマルチパートで返します。Content-typeはmultipart/byterangesになります。

    • -

というようなことを今調べた。
この前、PDFファイルとかを読み込んで返すだけのCGIを作ったんだけど、静的なPDFを読み込むときより待ち時間が多いなーと思ってLive-HTTP-headersでヘッダとかを見ていたら、静的の場合にレスポンスが206 Partial Contentになる場合がありました。で、CGIではRangeヘッダなんて見てないので、ファイルが大きくてもとにかく全読み込みして一気に返してるわけです。それで遅いんだな。単純なプログラムなのに奥が深い。
つーか、そもそもなんでCGIにしてるかってーと、ダウンロード数をカウントしたいっていうただそれだけなんですね。ただそれだけならプログラムを介してカウントするって方法じゃなくてApacheのログを集計したほうがいいような気がしてきました(もう遅いけど)。これだけの理由でプログラムを複雑にするのは割にあわない。

    • -

CPANにはHTTP::RangeSaverってモジュールがあって、最初なにをするためのものかさっぱりわからなくて、しかもSaverじゃなくてServerだと思ってたのでこれ使えばできるのかーと勘違いしてしまいました。HTTP::RangeSaverはそうじゃなくてクライアント側の話で、部分的GETをするためのヘルパーモジュールなのでした。

    • -

あと1つわからないことがあって、ブラウザは普通にGETするのか、Rangeヘッダをつけて部分的GETをするのかをどうやって決めるんだろうね。ファイルのサイズなんてサーバーに聞いてみないことにはわからないと思うんだけど。どうでしょう。

    • -

studyinghttp.net - このウェブサイトは販売用です! - 解説 仕様書 利用 技術 である 手法 日本語訳 プログラミング リソースおよび情報
https://www.codeblog.org/blog/inoue/20070114.html
HTTP::RangeSaver - handle partial content HTTP responses - metacpan.org

    • -

書いてる途中でブラウザが落ちて一瞬こおり、と書いていたらまた落ちてビビる。「セッションを復元」ってしたら復活したのでよかったけど。