Ruby 如何使用';net/http';到达文件结尾时失败(EOR)

Ruby 如何使用';net/http';到达文件结尾时失败(EOR),ruby,net-http,Ruby,Net Http,我使用的是Ruby版本2.3.0 我想检查我的应用程序何时启动,我为我的“deployer”编写了这个方法。 在运行时http.request\u get(uri)引发 EOFError: end of file reached 当我通过http://localhost作为方法的第一个参数: require 'net/http' def check_start_application(address, port) success_codes = [200, 301] attempts

我使用的是Ruby版本2.3.0

我想检查我的应用程序何时启动,我为我的“deployer”编写了这个方法。 在运行时
http.request\u get(uri)
引发

EOFError: end of file reached
当我通过
http://localhost
作为方法的第一个参数:

require 'net/http'

def check_start_application(address, port)
  success_codes = [200, 301]
  attempts = 200
  uri = URI.parse("#{address}:#{port}")
  http = Net::HTTP.new(uri.host, uri.port)

  attempts.times do |attempt|
    # it raises EOFError: end of file reached
    http.request_get(uri) do |response|
      if success_codes.include?(response.code.to_i)
        return true
      elsif attempt == attempts - 1
        return false
      end
    end
  end
end
但是,当我使用irb从上下文中单独测试此方法时,此代码在两种情况下运行良好:

check_start_application('http://example.com', '80')
check_start_application('http://localhost', any_port)
在应用程序的上下文中,此代码仅适用于一种情况:

check_start_application('http://example.com', '80')
我尝试的是:

  • 使用“rest客户端”而不是“net/http”
  • 将“net/https”与
    http一起使用。使用\u ssl=false
  • 从方法中删除
  • 在请求之前调用
    sleep

谁面临着类似的问题?我相信我不是唯一一个。

可能是在部署中,您的应用程序正在SSL上运行。在没有访问权限的情况下很难帮助调试,但请尝试:

http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true

代码在哪个端口失败?您的应用程序是否在https上运行?@rorra Thx。我的应用程序部署在一个随机的自由端口上,我使用Docker来实现这一点。端口范围在临时端口范围内。应用程序没有在https上运行。@rorra我通过%x(curl--write out%{http_code}--silent 127.0.0.1:#{any_port})得到了我想要的东西。但这不是检查反应的正确方法。