使用 HTTP.jl 设置获取请求的超时

Set timeout for get request with HTTP.jl

我必须扫描 IP 范围并希望减少超时等待时间。 我如何使用 Julia 的 HTTP.jl 包指定请求超时?

我在 v.0.6.15 的文档中找到了 readtimeout 选项:

conf = (readtimeout = 10,
        pipeline_limit = 4,
        retry = false,
        redirect = false)

HTTP.get("http://httpbin.org/ip"; conf..)

但在当前的稳定版本中v0.8.6 readtimeout接缝只出现在服务器端。

使用 readtimeout=2 和 v.0.8.6 的测试代码:

@time begin
    try
        HTTP.get("http://2.160.0.0:80/"; readtimeout=2)
    catch e
        @info e
    end
end

输出:

113.642150 seconds (6.69 k allocations: 141.328 KiB)
┌ Info: IOError(Base.IOError("connect: connection timed out (ETIMEDOUT)", -4039) during request(http://2.160.0.0:80/))
└ @ Main In[28]:5

所以这个请求花了大约 114 秒,因此我认为这个选项目前不受支持。

编辑 我检查了稳定版的源代码(HTTP.jl):

Timeout options
 - `readtimeout = 60`, close the connection if no data is received for this many
   seconds. Use `readtimeout = 0` to disable.

给出这个例子:

HTTP.request("GET", "http://httpbin.org/ip"; retries=4, cookies=true)
HTTP.get("http://s3.us-east-1.amazonaws.com/"; aws_authorization=true)
conf = (readtimeout = 10,
        pipeline_limit = 4,
        retry = false,
        redirect = false)
HTTP.get("http://httpbin.org/ip"; conf..)
HTTP.put("http://httpbin.org/put", [], "Hello"; conf..)

所以它应该可以工作...

它绝对没有达到预期的效果。 这里发生了很多事情:

首先,HTTP.jl 中幂等请求的默认设置是重试 4 次。所以 HTTP.get 只会在 5 * readtimeout 之后失败。您可以通过在参数中传递 retry = false 来更改它。

我注意到的第二件事是检查超时连接的时间间隔很长。 (参见 TimeoutRequest Layer)它仅每 8 到 12 秒检查一次超时,因此低于 8 秒的超时不会执行任何操作。 (我怀疑这些应该是 8-12 毫秒而不是实现的秒数)

最后,HTTP.request 缺少 0.8.6 的文档。我已经 made a PR 解决了这个问题。