Domanda

Sto cercando di scrivere uno script rubino che ottiene alcuni dettagli sui file su un sito web utilizzando net/http. I miei sguardi codice come questo:

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

vorrei ottenere due pezzi di informazioni da questa richiesta:. La lunghezza totale del contenuto gonfiato, e (se del caso) la lunghezza del contenuto sgonfiato

A volte, le intestazioni includerà un parametro content-length, che sembra essere la lunghezza gzipped del contenuto. Posso anche approssimare le dimensioni gonfiato del contenuto utilizzando res.body.length, ma questo non è stato infallibile con uno sforzo d'immaginazione. La documentazione sulla net/http dice che le intestazioni gzip vengono rimossi dalla lista automaticamente (per Aiuto me, Gee grazie) e quindi non riesco a ottenere una maniglia affidabile su queste informazioni.

Ogni aiuto è apprezzato (comprese altre gemme se essi faranno questo più facilmente).

È stato utile?

Soluzione

Ci sono! Il comportamento "magia" avviene qui solo se non si specifica il proprio intestazione accept-encoding. codice modificato come segue:

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

Altri suggerimenti

Si può provare utilizzare i socket per inviare richiesta HEAD al server con è più veloce (nessun contenuto) e non inviare "Accept-Encoding: gzip"., Quindi la risposta non sarà gzip

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top