Questo è un thread vecchio, ma è ancora una domanda che sembra per lo più senza risposta secondo la mia ricerca. Ecco una soluzione mi è venuta dalla scimmia-patching Net :: HTTP un po ':
require 'net/http'
# provide access to the actual socket
class Net::HTTPResponse
attr_reader :socket
end
uri = URI("http://www.example.com/path/to/file")
begin
Net::HTTP.start(uri.host, uri.port) do |http|
request = Net::HTTP::Get.new(uri.request_uri)
# calling request with a block prevents body from being read
http.request(request) do |response|
# do whatever limited reading you want to do with the socket
x = response.socket.read(100);
end
end
rescue IOError
# ignore
end
Il salvataggio cattura l'IOError che viene generata quando si chiama HTTP.finish prematuramente.
Cordiali saluti, il socket all'interno dell'oggetto HTTPResponse
non è un vero IO
oggetto (si tratta di una classe interna denominata BufferedIO
), ma è abbastanza facile da scimmia-patch che, troppo, per imitare i metodi IO
necessari. Ad esempio, un'altra libreria stavo usando (exifr) aveva bisogno il metodo readchar
, che era facile da aggiungere:
class Net::BufferedIO
def readchar
read(1)[0].ord
end
end
fonte
2011-12-21 22:51:44
Ciao Michel, per qualche motivo ogni volta che provo un file, ad esempio 'http:// www.forcefieldpr.com/asdyoucantbealone.mp3', che funziona nel browser, continuo a ricevere una pagina 404 html. Questo dovrebbe fare con la richiesta? –
Ho inviato una modifica che corregge il problema @AaronMoodie. Alcuni server web hanno bisogno dell'intestazione "Host", quindi ho aggiunto solo: 'request =" GET # {percorso} HTTP/1.1 \ r \ nHost: # {host} \ r \ n \ r \ n "' – inket