Dies ist ein alter Thread, aber es ist immer noch eine Frage, die nach meinen Recherchen meist unbeantwortet bleibt. Hier ist eine Lösung, die ich mit von Affen-Patching Net kam :: HTTP ein bisschen:
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
Die Rettung fängt den IOError, die ausgelöst wird, wenn Sie HTTP.finish vorzeitig rufen.
FYI, die Buchse innerhalb des HTTPResponse
Objekts ist kein echtes IO
Objekt (es ist eine interne Klasse BufferedIO
genannt), aber es ist ziemlich leicht zu Affen-Patch, der auch die IO
Methoden nachzuahmen Sie benötigen. Zum Beispiel habe ich eine andere Bibliothek wurde unter Verwendung (exifr) benötigt die readchar
Methode, die hinzuzufügen war leicht zu:
class Net::BufferedIO
def readchar
read(1)[0].ord
end
end
Hallo Michel, aus irgendeinem Grund, wenn ich eine Datei versuchen, wie 'http:// www.forcefieldpr.com/asdyoucantbealone.mp3', das im Browser funktioniert, bekomme ich immer eine 404 html Seite. Würde das mit der Anfrage zu tun haben? –
Ich habe eine Bearbeitung eingereicht, die das Problem behebt, das @AaronMoodie hat. Einige Webserver benötigen den Header "Host", also habe ich einfach folgendes hinzugefügt: 'request =" GET # {Pfad} HTTP/1.1 \ r \ nHost: # {host} \ r \ n \ r \ n "' – inket