Frage

Ich versuche, ein Ruby -Skript zu schreiben, das einige Details zu Dateien auf einer Website mithilfe der Website erhält net/http. Mein Code sieht so aus:

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

Ich möchte zwei Informationen aus dieser Anfrage erhalten: die Gesamtlänge des aufgeblasenen Inhalts und (gegebenenfalls) die Länge des entleerten Inhalts.

Manchmal beinhalten die Header a content-length Parameter, der die gzipierte Länge des Inhalts zu sein scheint. Ich kann auch die aufgeblasene Größe des Inhalts unter Verwendung von res.body.length approximieren, aber dies wurde von keiner Vorstellungskraft narrensicher. Die Dokumentation zu net/http sagt, dass GZIP -Header automatisch aus der Liste entfernt werden (zu Hilfe Ich, Gee, danke), also kann ich anscheinend keinen zuverlässigen Griff für diese Informationen bekommen.

Jede Hilfe wird geschätzt (einschließlich anderer Edelsteine, wenn sie dies leichter tun).

War es hilfreich?

Lösung

Ich habs! Das "magische" Verhalten hier tritt nur auf, wenn Sie Ihren eigenen Akzeptanz-Header nicht angeben. Geänderter Code wie folgt:

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

Andere Tipps

Sie können versuchen, Sockets zu verwenden, um die Kopfanforderung an den Server mit IS schneller zu senden (kein Inhalt) und nicht "Akzeptanzkodierung: gzip" zu senden, daher ist Ihre Antwort nicht gzip.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top