質問
私はウェブサイト上のファイルに関するいくつかの詳細を使用して、Rubyスクリプトを書き込もうとしています net/http
. 。私のコードは次のようになります:
require 'open-uri'
require 'net/http'
url = URI.parse asset
res = Net::HTTP.start(url.host, url.port) {|http|
http.get(asset)
}
headers = res.to_hash
p headers
このリクエストから2つの情報を取得したいと思います。コンテンツの合計長さが膨らんだり、(必要に応じて)コンテンツの長さがデフレになっています。
時々、ヘッダーにはaが含まれます content-length
コンテンツのGziptingの長さのように見えるパラメーター。また、res.body.lengthを使用してコンテンツの膨らんだサイズに近似することもできますが、これは想像力の範囲によって絶対に困難ではありません。のドキュメント net/http
GZIPヘッダーはリストから自動的に削除されていると言います( ヘルプ 私、ありがとう)だから、私はこの情報を信頼できるハンドルを得ることができないようです。
どんな助けも高く評価されています(他の宝石がこれをより簡単に行う場合は、他の宝石を含む)。
解決
とった!ここでの「魔法」の動作は、自分の受け入れエンコードヘッダーを指定しない場合にのみ発生します。次のように修正コード:
require 'open-uri'
require 'net/http'
require 'date'
require 'zlib'
headers = { "accept-encoding" => "gzip;q=1.0,deflate;q=0.6,identity;q=0.3" }
url = URI.parse asset
res = Net::HTTP.start(url.host, url.port) {|http|
http.get(asset, headers)
}
headers = res.to_hash
gzipped = headers['content-encoding'] && headers['content-encoding'][0] == "gzip"
content = gzipped ? Zlib::GzipReader.new(StringIO.new(res.body)).read : res.body
full_length = content.length,
compressed_length = (headers["content-length"] && headers["content-length"][0] || res.body.length),
他のヒント
ソケットを使用してヘッドリクエストをサーバーに送信して、より速く(コンテンツなし)、「Accept-Encoding:GZIP」を送信しないため、応答はGZIPになりません。
所属していません StackOverflow