Это старая ветка, но, по моим исследованиям, этот вопрос все еще остается без ответа. Вот решение, которое я придумал, немного исправив 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.
К вашему сведению, сокет в объекте HTTPResponse
не является истинным объектом IO
(это внутренний класс с именем BufferedIO
), но довольно просто сделать обезьяну-патч, которая тоже имитирует IO
методы, которые вам нужны. Например, другая библиотека, которую я использовал (exifr), нуждалась в методе readchar
, который было легко добавить:
class Net::BufferedIO
def readchar
read(1)[0].ord
end
end