Verwenden Sie Ruby, um die Inhaltslänge von URLs zu erhalten
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).
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.