EOFError: फ़ाइल का अंत नेट :: HTTP के साथ जारी किया गया


158

मैं रूबी-1.8.7-p302 / रेल 2.3.11 का उपयोग कर रहा हूं। मैं एक लिंक के लिए आँकड़े प्राप्त करने के लिए FQL (फेसबुक एपीआई) का उपयोग करने की कोशिश कर रहा हूं। यहाँ मेरा कोड है:

def stats(fb_post_url)
  url = BASE_URI + "?query=#{URI.encode("select like_count from link_stat where url=\"#{fb_post_url}\"")}"
  parsed_url = URI.parse(url)
  http = Net::HTTP.new(parsed_url.host, parsed_url.port)
  request = Net::HTTP::Get.new(parsed_url.request_uri)

  response = http.request(request)
  response.inspect
end

और यहाँ त्रुटि है:

EOFError: end of file reached
from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/net/protocol.rb:135:in `sysread'
from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/net/protocol.rb:135:in `rbuf_fill'
from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/timeout.rb:67:in `timeout'
from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/timeout.rb:101:in `timeout'
from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/net/protocol.rb:134:in `rbuf_fill'
from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/net/protocol.rb:116:in `readuntil'
from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/net/protocol.rb:126:in `readline'
from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/net/http.rb:2028:in `read_status_line'
from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/net/http.rb:2017:in `read_new'
from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/net/http.rb:1051:in `request'
from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/net/http.rb:1037:in `request'
from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/net/http.rb:543:in `start'
from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/net/http.rb:1035:in `request'
from /home/rahul/Work/Radr/lib/fb_stats.rb:13:in `stats'
from (irb):10

यह केवल फेसबुक एपीआई के मामले में हो रहा है। इसके अलावा, मैंने देखा कि यह कुछ पोस्ट में सुझाया गया है यह नेट :: HTTP में बग हो सकता है।


3
क्या आपको इसके लिए समाधान मिला? मैं एसएफडीसी एपीआई में इसी तरह की समस्या का सामना कर रहा हूं।
नीलेश

जवाबों:


281

यदि URL http के बजाय https का उपयोग कर रहा है, तो आपको निम्नलिखित पंक्ति जोड़ने की आवश्यकता है:

parsed_url = URI.parse(url)
http = Net::HTTP.new(parsed_url.host, parsed_url.port)
http.use_ssl = true

अतिरिक्त नोट करें http.use_ssl = true

और अधिक उपयुक्त कोड जो http और https दोनों को हैंडल करेगा, वह निम्नलिखित के समान होगा।

url = URI.parse(domain)
req = Net::HTTP::Post.new(url.request_uri)
req.set_form_data({'name'=>'Sur Max', 'email'=>'some@email.com'})
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = (url.scheme == "https")
response = http.request(req)

मेरे ब्लॉग में और देखें: नेट: HTTP के साथ फॉर्म पोस्ट करते समय EOFError: फ़ाइल का अंत जारी किया गया


धन्यवाद, इससे मुझे httpऔर के बीच के अंतर को समझने में मदद मिली req
गुप्तार

6
ब्लॉग पोस्ट लिंक टूटा हुआ है, लेकिन यह प्रयास करें: web.archive.org/web/20150429191916/http://expressica.com/2012//-
हेनरिक एन

यदि यह https नहीं है तो क्या होगा?
Jwan622

5

मुझे गैर-एसएसएल सेवा के अनुरोध के साथ इसी तरह की समस्या थी।

इस ब्लॉग ने URI को 'पाने' के लिए दिए गए URL को एन्कोडिंग करने की कोशिश करने के लिए अस्पष्ट सुझाव दिया: http://www.loudthinking.org/2010/02/ruby-eoferror-end-of-file-reached.html

मैंने इस पर एक शॉट लिया, हताशा के आधार पर, और मेरे सीमित परीक्षण में ऐसा लगता है कि यह मेरे लिए तय हो गया है। मेरा नया कोड है:

@http = Net::HTTP.new('domain.com')  
@http = @http.start    
url = 'http://domain.com/requested_url?blah=blah&etc=1'
req = Net::HTTP::Get.new(URI.encode(url))
req.basic_auth USERNAME, API_KEY
res = @http.request(req) 

ध्यान दें कि मैं @ HTTP.start का उपयोग करता हूं क्योंकि मैं कई अनुरोधों पर HTTP सत्र को बनाए रखना चाहता हूं। इसके अलावा, आप सबसे अधिक प्रासंगिक भाग की कोशिश करना पसंद कर सकते हैं, जो है: URI.encode (url) , कॉल प्राप्त करें


2
मैं इस पर कुछ अतिरिक्त प्रतिक्रिया देना चाहता था, क्योंकि यह अभी भी उपयोगी लगता है। मैं 4 महीने के लिए एक उत्पादन सर्वर पर इस एनकोडेड यूआरआई का उपयोग करके चला रहा हूं और मैं पुष्टि कर सकता हूं कि इसने समस्या को ठीक कर दिया है।
फिल

3

मुझे लगता है कि मैं नेट :: HTTP और नेट :: एफ़टीपी समस्याओं में समय-समय पर भाग लेता हूं, और जब मैं करता हूं, तो टाइमआउट के साथ कॉल के आसपास () उन सभी मुद्दों को गायब कर देता है। तो जहां यह कभी-कभार 3 मिनट के लिए लटका होगा और फिर एक EOFError बढ़ाएँगे:

res = Net::HTTP.post_form(uri, args)

यह हमेशा मेरे लिए इसे ठीक करता है:

res = timeout(120) { Net::HTTP.post_form(uri, args) }

3

मुझे वही समस्या थी, रूबी-1.8.7-p357, और व्यर्थ में चीजों का भार उठाने की कोशिश की ...

मैंने आखिरकार महसूस किया कि यह एक ही XMLRPC :: क्लाइंट उदाहरण का उपयोग करके कई कॉल पर होता है!

इसलिए अब मैं प्रत्येक कॉल पर अपने क्लाइंट को फिर से इंस्टेंट कर रहा हूं और यह सिर्फ काम करता है: |


1

कुछ शोध करने के बाद, यह रूबी के XMLRPC::Clientपुस्तकालय में हो रहा था - जो उपयोग करता है NET::HTTP। क्लाइंट उस start()पद्धति का उपयोग करता है NET::HTTPजिसमें भविष्य के अनुरोधों के लिए कनेक्शन खुला रहता है।

अंतिम अनुरोधों के बाद 30 सेकंड में यह ठीक हुआ - इसलिए मेरी धारणा यह है कि यह जिस सर्वर को मार रहा है, वह उस समय के बाद के अनुरोधों को बंद कर रहा है। मुझे यकीन नहीं है कि NET::HTTPअनुरोध को खुला रखने के लिए डिफ़ॉल्ट क्या है - लेकिन मैं यह देखने के लिए 60 सेकंड के साथ परीक्षण करने वाला हूं कि क्या यह समस्या हल करता है।


1
आपका रिजल्ट क्या था?
पीटर मोर्टेंसन

1

मैं हाल ही में इसमें भाग गया और अंततः पाया गया कि यह उस एंडपॉइंट के नेटवर्क टाइमआउट के कारण था जिसे हम मार रहे थे। सौभाग्य से हमारे लिए हम टाइमआउट अवधि बढ़ाने में सक्षम थे।

यह सत्यापित करने के लिए कि हमारा मुद्दा था (और वास्तव में नेट http के साथ कोई मुद्दा नहीं है), मैंने कर्ल के साथ एक ही अनुरोध किया और पुष्टि की कि अनुरोध समाप्त हो रहा है।


-1

रूबी ऑन रेल्स में मैंने इस कोड का उपयोग किया था, और यह पूरी तरह से काम करता है:

req_profilepic = ActiveSupport::JSON.decode(open(URI.encode("https://graph.facebook.com/me/?fields=picture&type=large&access_token=#{fb_access_token}")))

profilepic_url = req_profilepic['picture']
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.