auのコンテンツダウンロードに苦戦
なんだかうまくいかない.
高々ダウンロードがだ.なぜだ.
なんか,決まったサイズ以下しかダウンロードがうまくいかない.こまった.
どの機種でやっても結果は同じ.うーん.仕様書にもそんなこと書いてないし.
と悩みながらaccessログを見てたら.
「HTTP/1.1" 206 xxxxxx "-" "KDDI-」
206!!
Partial Contentか!
ということで解決.
filesize = File::size(path) range = ENV["HTTP_RANGE"] if range and /^bytes=(\d+)\-(\d+)$/ =~ range offset = $1.to_i limit = $2.to_i length = limit - offset + 1 end header = Hash::new header["status"] = "PARTIAL_CONTENT" header["Accept-Ranges"] = "bytes" header["Content-Range"] = sprintf("bytes %d-%d/%d", offset, limit, filesize) header["Content-Length"] = length header["Content-Type"] = "audio/3gpp2" header["Content-Disposition"] = "devmpzz" cgi = CGI::new print cgi.header(header) if offset <= filesize print IO::read(path, length, offset) end
こんな感じ.
ポイントは・・・
- HTTP_RANGEをチェック
- HTTP/1.1 206 Partial Contentをセット
- Content-Range: bytes xx-xx/xxxxをセット
- 必要なデータ部分を抜き出して出力
- 必要な分リクエストがくるので,上記を繰り返して終了