Это старая тема, но это все еще вопрос, который кажется главным образом без ответа в соответствии с моими исследованиями. Вот решение, которое я придумал по обезьяне-заплат Net :: HTTP НЕМНОГО:
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
Спасательное улавливает IOError, который выдается при вызове HTTP.finish преждевременно.
FYI, сокет в HTTPResponse
объект не является истинным IO
объекта (это внутренний класс называется BufferedIO
), но это довольно легко обезьяньего патч, который тоже, чтобы имитировать IO
методы вам нужно. Например, одна библиотека, я использовал (exifr) необходима readchar
метод, который легко добавить:
class Net::BufferedIO
def readchar
read(1)[0].ord
end
end
Привет Мишель, по какой-то причине, когда я пытаюсь файл, такие как 'HTTP:// www.forcefieldpr.com/asdyoucantbealone.mp3', который работает в браузере, я продолжаю получать 404 html-страницу. Будет ли это связано с запросом? –
Я отправил исправление, исправляющее проблему @AaronMoodie. Некоторым веб-серверам нужен заголовок «Host», поэтому я добавил именно это: 'request =" GET # {path} HTTP/1.1 \ r \ nHost: # {host} \ r \ n \ r \ n "' – inket