Установить тайм-аут для запроса на получение с HTTP.jl - PullRequest
2 голосов
/ 24 сентября 2019

Я сканировал диапазоны IP-адресов и хочу сократить время ожидания по таймаутам.Как указать время ожидания запроса с пакетом Джулии HTTP.jl?

Я нашел параметр readtimeout в документах для v.0.6.15 :

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

Так что он должен работать...

1 Ответ

2 голосов
/ 24 сентября 2019

Это определенно не делает то, что ожидается.Здесь происходит несколько вещей:

Прежде всего по умолчанию идемпотентные запросы в HTTP.jl должны повторяться 4 раза.Так что HTTP.get потерпит неудачу только после 5 * readtimeout.Вы можете изменить это, передав в аргументах retry = false.

Второе, что я заметил, это то, что проверка на тайм-аут соединений выполняется на очень большом интервале.(См. TimeoutRequest Layer ). Он проверяет тайм-аут только каждые 8-12 секунд, поэтому тайм-аут ниже 8 секунд ничего не делает.(Я подозреваю, что это должно быть 8-12 миллисекунд, а не секунд, как реализовано)

И, наконец, документы по 0.8.6 отсутствуют для HTTP.request.Я уже сделал PR , чтобы исправить это.

...