Errno::EBADF: Bad file descriptor with ruby net/http
Asked Answered
S

0

6

What can cause while making an HTTP connection to return EBADF (Bad file descriptor).

Here is my following code wherein the HTTP connection is made. Although the error is very less now(happening very less) but before I put those error on rescue I need to understand what is the reason for the EBADF

def make_http_request(url, headers={})
  uri = URI(url)
  Net::HTTP.start(uri.host, uri.port) do |http|
    req = Net::HTTP::Get.new(uri, headers)
    resp = http.request(req)
    if resp.code.to_i != 200
      logger.error "Retrieve #{resp.code} with #{url} and #{headers}"
      return false
    end
    return resp.body
  end
rescue SocketError, Net::ReadTimeout, Errno::ECONNREFUSED => e
  logger.error "make_http_request #{url} with #{headers} resulted in #{e.message} \n #{e.backtrace}"
  return false
end

I have a feeling that connect syscall is receiving an FD which ain't valid at that given point in time. But still unable to understand how can that happens.

If it helps the code is used in an application that operates with multiple threads.

In a nutshell, the definition of the above method looks like this...

module Eval
  def make_http_request(url, headers={})
    ...
    ...
    ..
  end

  def request_local_endpoint(url, headers)
     response = make_http_request(url, headers)
     response && response.fetch('bravo',nil)
  end

  def request_external_endpoint(url, headers)
    response = make_http_request(url, headers)
    response && response.fetch('token',nil)
  end
end

class RequestBuilder
  include Eval
  attr_reader :data
  def initialize(data)
    @data = data
  end

  def start
    token = request_external_endpoint('http://external.com/endpoint1',{'Content-Type'.freeze => 'application/json', 'Authorization' => 'abcdef'})
    return unless token

    result = request_local_endpoint('http://internal.com/endpoint1',{'Content-Type'.freeze => 'application/json'})
    return result
  end
end

10.times { 
   Thread.new { RequestBuilder.new('sample data').start }
}
Saida answered 14/3, 2018 at 13:56 Comment(1)
Did you get some solution? I am facing same issue.Cynar

© 2022 - 2024 — McMap. All rights reserved.