我已经得到了这个代码(大致):
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)
}
当我针对在浏览器中超时的网址执行代码时,它永远不会进入阻止。任何其他情况它完美地运作。在start方法中是否有一些我没有看到的行为?我假设在http.get(parsed_url.path)语句之前根本不会打开连接所以我很困惑为什么这个代码不会执行...
提前感谢...
答案 0 :(得分:1)
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
方法的文档,但这可能是你的罪魁祸首。
答案 1 :(得分:1)
Net::HTTP class的文档读取
打开TCP连接和HTTP会话。
因此,当您致电Net::HTTP.start
时,会建立连接,如果您无法访问指定的网址,则会在Timeout::Error
方法中抛出start
,并且您网内的代码为确实从未执行过。