EOFError: নেট :: HTTP- র সাথে ফাইলের সমাপ্তি ইস্যু হয়েছে


158

আমি রুবি-১.৮..7-পি 302 / রেলগুলি 2.3.11 ব্যবহার করছি। আমি একটি লিঙ্কের পরিসংখ্যান পেতে এফকিউএল (ফেসবুক এপিআই) ব্যবহার করার চেষ্টা করছি। আমার কোডটি এখানে:

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

এটি কেবল ফেসবুক এপিআইয়ের ক্ষেত্রেই ঘটছে বলে মনে হচ্ছে। এছাড়াও, আমি দেখেছি এটি কোনও পোস্টে প্রস্তাবিত এটি নেট :: এইচটিটিপিতে একটি বাগ হতে পারে।


3
আপনি কি এর সমাধান খুঁজে পেয়েছেন? আমি এসএফডিসি এপিআইতে অনুরূপ সমস্যার মুখোমুখি।
নিলেশ

উত্তর:


280

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)

আমার ব্লগে আরও দেখুন: EOFError: নেট :: HTTP সহ কোনও ফর্ম পোস্ট করার পরে ফাইলের ইস্যুতে পৌঁছেছে


ধন্যবাদ, আমার মধ্যে পার্থক্য বুঝতে সাহায্য করেছে httpএবং req
গুপ্ত্রন

6
ব্লগ পোস্টের লিঙ্কটি নষ্ট হয়ে গেছে, তবে এটি চেষ্টা করুন: web.archive.org/web/20150429191916/http://expressica.com/2012/…
হেনরিক এন

যদি এটি https না হয় তবে কী হবে?
Jwan622

5

নন-এসএসএল পরিষেবাদির অনুরোধে আমার একই সমস্যা ছিল।

: এই ব্লগের অস্পষ্টভাবে পরামর্শ কোনো URI URL রয়েছে যা থেকে 'get' পাস করা হয়েছে এনকোডিং চেষ্টা 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 সেশনটি বজায় রাখতে চাইলে @ http.start ব্যবহার করি। তা ছাড়া, আপনি সর্বাধিক প্রাসঙ্গিক অংশটি চেষ্টা করতে পারেন যা: ইউআরআই.এনকোড (ইউআরএল) কল কলটির অভ্যন্তরে


2
আমি এটি সম্পর্কে কিছু অতিরিক্ত প্রতিক্রিয়া সরবরাহ করতে চেয়েছিলাম, যেহেতু এটি এখনও দরকারী বলে মনে হচ্ছে। আমি 4 মাস ধরে একটি প্রোডাকশন সার্ভারে এই এনকোডযুক্ত ইউআরআই ব্যবহার করছি এবং আমি নিশ্চিত করতে পারি যে এটি সমস্যার সমাধান করেছে।
ফিল

3

আমি দেখতে পেয়েছি যে আমি নিয়মিত নেট :: এইচটিটিপি এবং নেট :: এফটিপি সমস্যাগুলিতে ছুটে চলেছি এবং যখন আমি সময় কাটিয়েছি () এর সাথে কলটি ঘেরাও করে ফেলেছে তখন সেগুলি সমস্ত সমস্যার অদৃশ্য হয়ে যায়। সুতরাং যেখানে এটি মাঝেমধ্যে 3 মিনিট বা তার বেশি সময় স্থির থাকবে এবং তারপরে একটি EOFError বাড়াবে:

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

এটি আমার জন্য সর্বদা এটি স্থির করে:

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

3

আমার একই সমস্যা ছিল, রুবি-১.৮..7-পি 357, এবং বৃথা প্রচুর জিনিস চেষ্টা করেছিলাম ...

আমি শেষ পর্যন্ত বুঝতে পেরেছিলাম যে এটি একই এক্সএমএলআরপিসি :: ক্লায়েন্টের উদাহরণ ব্যবহার করে কেবল একাধিক কলগুলিতে ঘটে happens

সুতরাং এখন আমি প্রতিটি কলটিতে আমার ক্লায়েন্টকে পুনরায় ইনস্ট্যান্ট করছি এবং এটি কেবল কার্যকর: |


1

কিছু গবেষণা করার পরে, এটি রুবির XMLRPC::Clientলাইব্রেরিতে ঘটছিল - যা ব্যবহার করে NET::HTTP। ক্লায়েন্ট সেই start()পদ্ধতিটি ব্যবহার করে NET::HTTPযাতে ভবিষ্যতের অনুরোধগুলির জন্য সংযোগটি উন্মুক্ত রাখে।

এটি সর্বশেষ অনুরোধগুলির 30 সেকেন্ড পরে অবিকল ঘটেছিল - তাই আমার ধারণা এখানেই অনুমান করা হচ্ছে যে সার্ভারটি এটি আঘাত করছে সেই সময়ের পরে অনুরোধগুলি বন্ধ করা হচ্ছে। আমি NET::HTTPঅনুরোধটি খোলার জন্য ডিফল্ট কী তা নিশ্চিত নই - তবে সমস্যাটি সমাধান করে কিনা তা দেখার জন্য আমি 60 সেকেন্ডের সাথে পরীক্ষা করতে যাচ্ছি।


1
ফলাফল কি ছিল?
পিটার মর্টেনসেন

1

আমি সম্প্রতি এটিতে ছুটে এসেছি এবং অবশেষে দেখতে পেলাম যে এটি আমরা শেষের পয়েন্ট থেকে শেষ করছি এমন একটি নেটওয়ার্ক সময়সীমা দ্বারা ঘটেছিল। ভাগ্যক্রমে আমাদের জন্য আমরা সময়সীমা সময়কাল বাড়িয়ে তুলতে সক্ষম হয়েছি।

এটি যাচাই করার জন্য আমাদের সমস্যা ছিল (এবং প্রকৃতপক্ষে নেট এইচটিপি-র কোনও সমস্যা নয়), আমি একই অনুরোধটি কার্ল দিয়ে করেছি এবং নিশ্চিত করেছি যে অনুরোধটি সমাপ্ত হচ্ছে।


-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']
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.