[Moscow.pm] AnyEvent::HTTP как ограничить размер ответа?
Oleg Alistratov
ali на ali.org.ua
Пт Дек 11 05:03:30 PST 2015
11.12.2015, 14:31, "Павел Купцов" <pavel на kuptsov.info>:
> Коллеги, вот вопрос по теме рассылки есть, т.е. по perl :)
>
> Кто пользует у себя сабж - в частности его метод http_get,
> как решаете вопрос с ограничением размера ответа сервера?
> А то у меня попадаются в запросах сайты которые бесконечно отдают text/html, в итоге скрипт не заканчивается по таймауту, а все это дело принимает в память, что ведет к ее исчерпанию.
«Бесконечно» — это как именно бесконечно? В заголовках ответа есть Content-Length? Есть, но не соответствует правде? Или нет? Или нет, но внезапно есть Upgrade: WebSocket? ;)
Если там нормальный документ, просто слишком большой, чтобы его принимать, достаточно повесить обработчик на on_header и возвращать из него 0, если что-то не устраивает:
http_get $url,
on_header => sub {
my ($headers) = @_;
return ($headers->{'content-length'} > 16384) ? 0 : 1;
},
sub { ... }
> Вот на сейчас у меня примерно так:
> http_get $url,
>
> headers => {
> 'user-agent' => 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36',
> },
>
> on_header => sub {
> $_[0]{"content-type"} =~ /^text\/html\s*(?:;|$)/
> },
>
> timeout => 20,
>
> sub {
> my ( $body, $hdr ) = @_;
>
> if ( $hdr->{Status} =~ /^2/ ) {
> say "OK";
> }
> else {
> say "Error: $hdr->{Status}";
> }
>
> Пока только вижу вариант с установкой обработчика на on_body - но не нашел живых примеров. Если подкините немного - мои бесконечные благодарности :)))
>
> --
> Павел
--
Oleg Alistratov
Подробная информация о списке рассылки Moscow-pm