11.12.2015, 14:31, "Павел Купцов" <[email protected]>:
> Коллеги, вот вопрос по теме рассылки есть, т.е. по 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 mailing list
[email protected] | http://moscow.pm.org

Ответить