我有这段代码(大致(:
parsed_url = URI.parse(url_string)
puts "before Net::HTTP.start block"
response = Net::HTTP.start(parsed_url.host, parsed_url.port) { |http|
puts "inside Net::HTTP.start block"
http.read_timeout = 10
http.get(parsed_url.path)
}
当我针对浏览器中超时的 url 执行代码时,它永远不会进入块。任何其他情况都可以完美运行。启动方法上是否有一些我没有看到的行为?我假设在 http.get(parsed_url.path( 语句之前根本不会打开连接,所以我很困惑为什么这段代码更不执行......
提前感谢...
Net:HTTP.start
调用do_start
然后调用connect
(它们都是私有方法(:
http://apidock.com/ruby/Net/HTTP/connect
前 3 行是
D "opening connection to #{conn_address()}..."
s = timeout(@open_timeout) { TCPSocket.open(conn_address(), conn_port()) }
D "opened"
虽然我似乎找不到timeout
方法的文档,但这可能是您的罪魁祸首。
Net::HTTP 类的文档如下:
打开 TCP 连接和 HTTP 会话。
因此,当您调用 Net::HTTP.start
时,将建立连接,如果您无法访问给定的 URL,则会在 start
方法中抛出一个Timeout::Error
,并且块中的代码确实永远不会执行。