यह एक पुराना धागा है, लेकिन यह अभी भी एक प्रश्न है जो मेरे शोध के अनुसार अधिकतर अनुत्तरित लगता है।
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 समय से पहले ही फोन: यहाँ एक समाधान बंदर-पैच Net :: HTTP थोड़ा द्वारा मैं के साथ आया है।
FYI करें, HTTPResponse
वस्तु के भीतर सॉकेट एक सच्चे IO
वस्तु (यह एक आंतरिक वर्ग BufferedIO
कहा जाता है) नहीं है, लेकिन यह बहुत बंदर-पैच कि, भी, IO
तरीकों की जरूरत है नकल करने के लिए आसान है। उदाहरण के लिए, एक और पुस्तकालय मैं (exifr) का उपयोग किया गया था readchar
विधि है, जो आसान था जोड़ने के लिए की जरूरत:
class Net::BufferedIO
def readchar
read(1)[0].ord
end
end
स्रोत
2011-12-21 22:51:44
हाय मिशेल, किसी कारण जब भी मैं इस तरह के 'के रूप में एक फ़ाइल की कोशिश के लिए http:// www.forcefieldpr.com/asdyoucantbealone.mp3', जो ब्राउज़र में काम करता है, मुझे 404 एचटीएमएल पेज मिल रहा है। क्या यह अनुरोध के साथ किया जाएगा? –
मैंने एक संपादन सबमिट किया जो इस मुद्दे को हल करता है @AaronMoodie है। कुछ वेब सर्वरों को "होस्ट" हेडर की आवश्यकता होती है, इसलिए मैंने बस इतना जोड़ा: 'request = "GET # {path} HTTP/1.1 \ r \ n होस्ट: # {होस्ट} \ r \ n \ r \ n" ' – inket