[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