2011-06-27 115 views
1

我有了这个代码(大约):红宝石:网:: HTTP.start问题

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) 
} 

当我执行针对浏览器timesout的URL代码,它永远不会成块。任何其他情况,它完美的作品。在我看不到的启动方法上有一些行为吗?我假设连接将不会被打开,直到http.get(parsed_url.path)语句,所以我很困惑为什么这个代码更多不执行...

在此先感谢...

+0

你在虚拟机内运行吗?什么平台? –

+0

我是! Ubuntu客户端通过VirtualBox在win7 64位主机上运行 – jaydel

回答

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

Net::HTTP class的文档读取

打开TCP连接和HTTP会话。

所以,当你调用Net::HTTP.start,在建立连接,如果你不能访问给定的URL,然后Timeout::Error抛出的start方法内,确实永远不会执行你的块中的代码。