建立 HTTP 连接时会导致什么导致返回EBADF(错误的文件描述符)。
这是我的以下代码,其中建立了 HTTP 连接。虽然现在错误很少(发生得很少)但是在我将这些错误进行救援之前,我需要了解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
Run Code Online (Sandbox Code Playgroud)
我有一种感觉,connect syscall即收到了在该给定时间点无效的 FD。但还是无法理解怎么会这样。
如果它有帮助,该代码可用于使用多线程运行的应用程序。
简而言之,上述方法的定义是这样的……
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 }
}
Run Code Online (Sandbox Code Playgroud)