используйте ruby ​​для получения длины содержимого URL - PullRequest
2 голосов
/ 27 января 2011

Я пытаюсь написать скрипт 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

Я хотел бы получить две части информации из этого запроса: общую длину раздуваемого контента и (при необходимости) длину раздувшегося контента.

Иногда заголовки содержат параметр content-length, который, по-видимому, представляет собой сжатую длину содержимого. Я также могу аппроксимировать завышенный размер содержимого, используя res.body.length, но это не было надежным с точки зрения воображения. В документации по net/http говорится, что заголовки gzip удаляются из списка автоматически ( help me, gee спасибо), поэтому я не могу получить надежную информацию об этой информации.

Любая помощь приветствуется (включая другие драгоценные камни, если они сделают это легче).

Ответы [ 2 ]

3 голосов
/ 27 января 2011

Понял!«Волшебное» поведение здесь происходит, только если вы не указали свой собственный заголовок 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 голосов
/ 27 января 2011

Вы можете попробовать использовать сокеты для отправки запроса HEAD на сервер с более быстрой (без содержимого) и не отправлять «Accept-Encoding: gzip», поэтому ваш ответ не будет gzip.

...