2

を使用して Web サイト上のファイルに関する詳細を取得する 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 つの情報を取得したいと思います: コンテンツの拡張された全長と、(必要に応じて) 収縮されたコンテンツの長さです。

ヘッダーにはcontent-length、コンテンツの gzip 圧縮された長さのように見えるパラメーターが含まれることがあります。res.body.length を使用して、コンテンツの膨張したサイズを概算することもできますが、これは想像力を駆使しても絶対確実ではありません。のドキュメントにnet/httpは、gzip ヘッダーがリストから自動的に削除されると書かれているため (私を助けるために、よろしくお願いします)、この情報について信頼できるハンドルを取得できないようです。

どんな助けでも大歓迎です(これをより簡単に行うことができる場合は、他のgemを含めて)。

4

2 に答える 2

3

とった!ここでの「魔法の」動作は、独自の accept-encoding ヘッダーを指定しない場合にのみ発生します。次のように修正されたコード:

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), 
于 2011-01-27T02:30:24.943 に答える
0

ソケットを使用して HEAD リクエストをサーバーに送信する方が高速 (コンテンツなし) で、「Accept-Encoding: gzip」を送信しないでください。そのため、応答は gzip になりません。

于 2011-01-27T01:16:25.850 に答える