2011-01-27 9 views
1

私はnet/httpを使ってウェブサイト上のファイルに関するいくつかの詳細を取得するルビースクリプトを作成しようとしています。 (必要に応じて)収縮させ、コンテンツの長さを膨らまコンテンツの合計の長さ、および:私はこの要求から2つの情報を取得したいと思いURLの内容の長さを取得するためにrubyを使用する

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 

:私のコードは次のようになります。

場合によっては、ヘッダーにはcontent-lengthパラメータが含まれますが、これはコンテンツの長さがgzippedと思われます。 res.body.lengthを使用してコンテンツのサイズを膨らませたものを近似することもできますが、これは想像力の伸びによって完全には保護されていません。 net/httpのドキュメントでは、gzipヘッダーがリストから自動的に削除される(help私、Geeありがとう)ので、この情報を信頼できるものにすることはできないと言います。

ご協力いただければ幸いです(他の宝石を含む場合もあります)。

答えて

2

ありがとうございました!ここでの「魔法の」振る舞いは、あなた自身のアクセプト符号化ヘッダーを指定しない場合にのみ発生します。修正コードは次のとおりです。

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), 
0

ソケットを使用してHEAD要求をサーバーに送信し、「Accept-Encoding:gzip」を送信しないようにして、応答がgzipにならないようにすることができます。