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をセット
  • 必要なデータ部分を抜き出して出力
  • 必要な分リクエストがくるので,上記を繰り返して終了

結構苦戦している人多いんじゃないかな??
検索用:3g2 devmpzz 着うた au KDDI ダウンロード出来ない