【问题标题】:How to implement custom 'time out' for https request?如何为 https 请求实现自定义“超时”?
【发布时间】:2012-05-22 06:09:57
【问题描述】:

我有通过 https 获取数据的工作代码(如下)。事实上,它通过 php 运行一些测试。我使用了正常的标准超时。现在,在“等待”服务器响应时,我需要实现计时器。因为在某些情况下测试不会完成 - php 代码不会完成 - ruby​​ 超时工作正常。所以我需要杀死一些进程来捕获现有 https 会话中的错误。

如何在现有超时之上为 https 请求实施自己的超时?

现有超时将始终大于自定义超时。例如,现有超时为 10 分钟,自定义为 5 分钟。

uri = URI.parse(url)
start = Time.new
http_read_timeout=60*10

connection = Net::HTTP.new(uri.host, 443)
connection.use_ssl = true
begin   
        response = connection.start() do |http|
            http.open_timeout =  50
            http.read_timeout = http_read_timeout
            http.request_get(uri.request_uri)
            # here I need to place a code that is triggered 
            # in case of custom timeout is reached
        end
rescue Timeout::Error
#  "Connection failed
    time_out_message ="security time out - after #{http_read_timeout} sec"
return time_out_message         

end

puts "finished"

【问题讨论】:

  • 如果设置了 http 连接 open_timeout 和 read_timeout 的超时时间,为什么测试无法完成?
  • php 代码不会完成 - ruby​​ 超时工作正常。我需要检测到“测试”不会完成然后终止一个进程,这将导致测试完成并显示错误消息。这就是为什么我需要这个“自定义超时”来捕获错误消息。当使用 ruby​​ 的超时时,由于测试尚未完成,因此不会捕获错误消息。
  • PHP 代码与我的问题无关。它可以是任何代码。运行文本的代码没问题,但测试正在测试的代码有一个错误。这就是这个练习的全部目的找到一个错误。如果我能捕捉到错误信息,那会让我的生活更轻松。测试是通宵完成的,所以第二天早上我必须重现手头的测试场景才能得到错误。
  • 另一方面,php 代码可以以强制输出错误消息的方式编写。我要求我们的开发人员进行修改,但不会很快发生。所以要么我找到自己的解决方案,要么......在这种情况下,php代码是无关紧要的。

标签: ruby timeout


【解决方案1】:

我不明白。您的自定义超时有什么作用?您正在发出 HTTP 请求……它要么返回,要么超时。

您已经在设置超时值。您的代码无法进入未来并告诉您外部代码最终会返回什么,如果它确实返回了......那么您到底想要它做什么?

但如果你真的只需要一个外部 Timeout 包装器,你可以使用 Timeout::Timeout。像这样:

require 'timeout'
Timeout::timeout(your_timeout_period) do
  run_some_code
rescue => err
  do_something_with err
  # and maybe the below?
  raise
end

【讨论】:

  • 我需要确定 HTTP 请求是否耗时过长。比我的“自定义超时”长。如果是,那么我需要执行一些“释放”php 进程的代码,然后 HTTP 成功完成。
  • 现有超时将始终大于自定义超时。例如,现有超时为 10 分钟,自定义为 5 分钟。
  • 您只需将您的 HTTP 代码放入我的代码块中即可。如果您在这里拥有的所有代码都放在名为 run_some_code 的方法中,它会正常工作:) ...除了做一些错误的事情,无论如何。
  • 嗯,我需要不要关闭 HTTP 请求。看起来我需要一个计时器而不是超时......可能我不太清楚我需要什么。您的代码会停止 HTTP 请求吗?
  • 哦。然后,您可以为 http 请求生成一个新线程。或者,如果其中的某些内容阻塞,请分叉一个新进程。
猜你喜欢
  • 1970-01-01
  • 2011-04-11
  • 2011-03-13
  • 1970-01-01
  • 1970-01-01
  • 2019-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多