Как сделать так, чтобы LWP просто продолжал, а не заканчивал работу, когда происходит тайм-аут? - PullRequest
1 голос
/ 30 июня 2011
read timeout at /usr/lib/perl5/site_perl/5.8.8/LWP/Protocol/http.pm line 426. at /usr/lib/perl5/site_perl/5.8.8/LWP/UserAgent.pm line 844

Кто-нибудь знает?

Ответы [ 3 ]

2 голосов
/ 30 июня 2011

LWP продолжает и продолжает следующий оператор по таймауту. В частности, он возвращает объект HTTP :: Response с кодом ошибки 5xx.

>perl -MLWP -e"my $ua = LWP::UserAgent->new(timeout => 1); print $ua->get('http://...something really slow...')->as_string;"
500 read timeout
Content-Type: text/plain
Client-Date: Thu, 30 Jun 2011 06:35:11 GMT
Client-Warning: Internal response

read timeout at .../lib/LWP/Protocol/http.pm line 433.
1 голос
/ 30 июня 2011

Просто продолжить что?

Если вы хотите отключить тайм-аут, просто вызовите ->timeout(0) на вашем объекте агента пользователя.

Чтобы исключение не завершило ваш процесс, оберните код в блок eval {}; см http://perldoc.perl.org/functions/eval.html.

Но мне любопытно узнать, как вы получаете исключение, которое вы показываете; использование LWP обычным способом уже перехватит это исключение и вернет ответ об ошибке, позволяя вашему коду продолжить Покажите свой код, если вам нужна помощь.

0 голосов
/ 21 августа 2013

Иногда, когда запрос отправляется, а ответ принимается, а затем соединение прерывается в середине этого процесса (ваше интернет-соединение прерывается), LWP возвращает $response->code 200 и будет$response->content равно частичной загрузке запрошенного вами контента.Затем, если вы повторите попытку, вы сразу же получите ошибку read timeout .

Конечно, это происходит только в том случае, если соединение потеряно в очень специфической части процесса ... ноэто происходит.

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

...