Đây là một chủ đề cũ, nhưng nó vẫn là một câu hỏi mà dường như hầu như không được trả lời theo nghiên cứu của tôi. Đây là một giải pháp mà tôi đã đưa ra bằng cách vá lỗi của Net: HTTP một chút:
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
Việc cứu bắt IOError bị ném khi bạn gọi HTTP.finish sớm.
FYI, các ổ cắm trong đối tượng HTTPResponse
không phải là một đối tượng IO
đúng (đó là một lớp học nội gọi BufferedIO
), nhưng nó khá dễ dàng để khỉ vá mà cũng vậy, để bắt chước IO
phương pháp mà bạn cần. Ví dụ, một thư viện tôi đã sử dụng (exifr) cần các readchar
phương pháp, đó là dễ dàng để thêm:
class Net::BufferedIO
def readchar
read(1)[0].ord
end
end
Nguồn
2011-12-21 22:51:44
Hi Michel, vì một lý do bất cứ khi nào tôi thử một tập tin như 'http:// www.forcefieldpr.com/asdyoucantbealone.mp3', hoạt động trong trình duyệt, tôi tiếp tục nhận được trang 404 html. Điều này có liên quan đến yêu cầu không? –
Tôi đã gửi bản chỉnh sửa khắc phục sự cố @AaronMoodie. Một số máy chủ web cần tiêu đề "Máy chủ", vì vậy tôi đã thêm vào đó: 'request =" GET # {path} HTTP/1.1 \ r \ nHost: # {host} \ r \ n \ r \ n "' – inket