2016-12-23 12 views
7

मैं एक यूआरएल क्रॉल करने के लिए रूबी के साथ नेट :: HTTP का उपयोग कर रहा हूं।रूबी नेट :: HTTP शीर्षलेख पढ़ें शरीर से पहले (बिना अनुरोध के)?

मैं ऑडियो स्ट्रीमिंग क्रॉल करने के लिए इस तरह के रूप नहीं करना चाहती: दोनों अभी http://listen2.openstream.co/334

वास्तव में

मैं केवल Html सामग्री, इसलिए कोई pdf, वीडियो, txt क्रॉल करना चाहते हैं ..

, मेरे पास है open_timeout और read_timeout 10 पर सेट है, इसलिए यदि मैं इन स्ट्रीमिंग ऑडियो पृष्ठों को क्रॉल करता हूं तो भी वे टाइमआउट करेंगे।

url = 'http://listen2.openstream.co/334' 
path = uri.path 

req= Net::HTTP::Get.new(path, {'Accept' => '*/*', 'Content-Type' => 'text/plain; charset=utf-8', 'Connection' => 'keep-alive','Accept-Encoding' => 'Identity'}) 

uri = Addressable::URI.parse(url) 

resp = Net::HTTP.start(uri.host, uri.inferred_port) do |httpRequest| 
    httpRequest.open_timeout = 10 
    httpRequest.read_timeout = 10 
    #how can I read the headers here before it's streaming the body and then exit b/c the content type is audio? 
    httpRequest.request(req) 
end 

हालांकि, वहाँ हेडर की जाँच करने के लिए इससे पहले कि मैं एक http प्रतिक्रिया के शरीर को पढ़ने अगर यह एक ऑडियो है देखने के लिए एक तरीका है? मैं एक अलग हेड अनुरोध भेजने के बिना ऐसा करना चाहता हूं।

+1

क्या मैं पूछ सकता हूं कि 'हेड' अनुरोध के साथ क्या गलत है जिसका आविष्कार इस सटीक मुद्दे को हल करने के लिए किया गया था? – mudasobwa

+0

आप 'स्वीकार करें' शीर्षलेख को 'टेक्स्ट/एचटीएमएल' पर सेट करने का भी प्रयास कर सकते हैं। अगर यूआरएल की सामग्री एचटीएमएल में प्रस्तुत नहीं है तो अच्छी तरह से व्यवहार किए गए सर्वरों को तुरंत HTTP 406 प्रतिक्रिया वापस करनी चाहिए। –

उत्तर

4

net/http स्ट्रीमिंग का समर्थन करता है, तो आप शरीर से पहले हेडर पढ़ने के लिए इसका उपयोग कर सकते हैं।

कोड उदाहरण,

url = URI('http://stackoverflow.com/questions/41306082/ruby-nethttp-read-the-header-before-the-body-without-head-request') 

Net::HTTP.start(url.host, url.port) do |http| 
    request = Net::HTTP::Get.new(url) 
    http.request(request) do |response| 

    # check headers here, body has not yet been read 
    # then call read_body or just body to read the body 

    if true 
     response.read_body do |chunk| 
     # process body chunks here 
     end 
    end 
    end 
end 
0

जब से मैं एक तरह से ठीक से Net :: HTTP में यह करने के लिए नहीं मिला, और मैंने देखा कि आप पहले से ही एक बाहरी निर्भरता के रूप में addressable मणि का उपयोग कर रहे हैं, यहाँ अद्भुत http gem एक समाधान का उपयोग कर रहा है:

require 'http' 

response = HTTP.get('http://listen2.openstream.co/334') 
# Here are the headers 
puts response.headers 

# Everything ok? Start streaming the response 
body = response.body 
body.stream! 

# now just call `readpartial` on the body until it returns `nil` 
# or some other break condition is met 

क्षमा करें अगर आपको नेट :: HTTP का उपयोग करने की आवश्यकता है, तो उम्मीद है कि किसी और को उत्तर मिलेगा। एक अलग HEAD अनुरोध वास्तव में उस मामले में जाने का तरीका हो सकता है।

0

आप एक मणि का उपयोग किए बिना शुद्ध संबंधित चीजों की एक पूरी मेजबान कर सकते हैं। बस net/http मॉड्यूल का उपयोग करें।

require 'net/http' 

url = URI 'http://listen2.openstream.co/334' 

Net::HTTP.start(url.host, url.port){|conn| 
    conn.request_get(url){|resp| 
    resp.each{|k_header, v_header| 
     # process headers 
     puts "#{k_header}: #{v_header}" 
    } 
    # 
    # resp.read_body{|body_chunk| 
    # # process body 
    # } 
    } 
} 

नोट: हेडर को संसाधित करते समय, बस content-type हेडर की जाँच करने के लिए सुनिश्चित करें। ऑडियो से संबंधित सामग्री के लिए इसमें आमतौर पर audio/mpeg मान होता है।

आशा है, इससे मदद मिली।

0

मैं आज रात बाद एक रूबी उदाहरण जोड़ूंगा। हालांकि, एक त्वरित प्रतिक्रिया के लिए। ऐसा करने के लिए एक सरल चाल है।

आप HTTP Range हेडर का उपयोग यह इंगित करने के लिए कर सकते हैं कि सर्वर से कौन सी बाइट्स आप प्राप्त करना चाहते हैं।

curl -XGET http://www.sample-videos.com/audio/mp3/crowd-cheering.mp3 -v -H "Range: bytes=0-1"

ऊपर के उदाहरण का मतलब है - यहाँ एक उदाहरण है। सर्वर 0 से 1 बाइट रेंज से डेटा वापस कर देगा।

FYI करें

: https://developer.mozilla.org/en-US/docs/Web/HTTP/Range_requests

आशा है कि आप के लिए काम करता है।

धन्यवाद

संबंधित मुद्दे