2011-01-27 109 views
1

我正在嘗試編寫一個ruby腳本,該腳本使用net/http獲取關於網站上文件的一些詳細信息。我的代碼如下所示:使用紅寶石獲取URL的內容長度

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參數,該參數似乎是內容的壓縮長度。我也可以使用res.body.length來近似膨脹的內容大小,但這種想象力並不是萬無一失的。在net/http文檔說gzip的頭被從清單中自動刪除(至幫助我,哎呀感謝),所以我似乎無法獲得此信息的可靠的手柄。

任何幫助表示讚賞(包括其他寶石,如果他們會更容易做到這一點)。

回答

2

Got it!如果你沒有指定你自己的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), 
0

您可以嘗試使用套接字來發送HEAD請求到服務器更快(無內容)和不發送「接受編碼:gzip」,所以你的反應不會在gzip。