2013-08-24 5 views
0

Я пытаюсь выполнить асинхронные запросы с использованием HTTP-модуля Perl AnyEvent со следующим кодом.Perl AnyEvent бросает ошибку HTTP 595

my $headers = { 
    'Accept'   => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 
    'Accept-Language'=> 'en-us,en;q=0.5', 
    'Connection'  => 'keep-alive' 
}; 

$request = http_request (
    GET => "$url", 
    timeout => 5, # seconds 
    # persistent => 1, 
    # keepalive => 1, 
    headers => $headers, 
    proxy => $proxyRef, 
    sub { 
     my ($body, $hdr) = @_; 
    } 
); 

я получаю следующий ответ из запроса:

{ 
    'Reason' => 'Connection timed out', 
    'URL' => 'url requested', 
    'Status' => 595 
}; 

Я проверка AnyEvent Документацию причины этой ошибки, но не увенчались успехом с этим. Не могу найти другие полезные темы по этой проблеме, кроме предложений повторить попытку с тайм-аутом, что дает тот же результат. Простой «wget» работает с одним и тем же URL и его живым. Может ли кто-нибудь указать, как отладить эту проблему?

+0

Что произойдет, если вы увеличите время ожидания до 50? – ikegami

+0

такой же результат даже тогда! –

+0

Как вы начинаете цикл событий? $ request не 'my'-ed, он используется в другом месте? Это очень помогло бы, если бы ваш образец кода был фактически минимальным исполняемым скриптом. – Dallaylaen

ответ

1

Ошибка «Время ожидания при подключении» указывает, что тайм-аут основного таймера подключен. То есть, когда AnyEvent :: HTTP пытается подключиться к веб-серверу или прокси-серверу, время ожидания соединения (обычно примерно через 30 секунд). Невозможно повлиять на этот тайм-аут.

В частности, проблема не является проблемой с самим запросом (эта фаза еще не была введена), ни разрешение DNS, ни то, что сервер отказывается от соединения. Проблема в том, что сервер не отвечает, то есть он отключен, интернет-соединение между вами и сервером не удался, или брандмауэр блокирует соединение.

Update

Я только что получил отчет пользователя, который столкнулся с этой проблемой в связи с несколько иной проблемой - он начал запрос HTTP, и вместо того, чтобы вернуться в цикл обработки событий, он блокировал свою программу дольше, чем таймаут (с использованием sleep). Другими словами, он начал HTTP-запрос, а затем сохранил библиотеку событий. Когда элемент управления окончательно rturned, AnyEvent :: HTTP моментально отключен, так как он не смог создать соединение во времени.

Учитывая, что ваш тайм-аут очень мал, это вполне может быть причиной - AnyEvent :: HTTP не может знать, зависает ли тайм-аут соединения из-за задержки сервера/сети или потому, что он просто не может получить достаточное количество процессорного времени для выполнения запросить в требуемое время.

Исправление в таком случае заключается в том, чтобы либо сократить время ожидания дольше, чтобы было достаточно времени, даже если было мало времени для процессора, либо реструктурировать программу, которая должна быть записана на основе событий, путем запуска цикл событий и использование таймера вместо сна.

 Смежные вопросы

  • Нет связанных вопросов^_^