質問

私はウェブサイト上のファイルに関するいくつかの詳細を使用して、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になりません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top