| Появилась задача, ограничит размер загружаемого файла при использовании LWP в Perl.
Погуглив с ходу ничего не нашел и пришлось смотреть в учебнике – и дабы заполнить пробел в гугле написать здесь.
Правильно было бы сообщить удаленному серверу размер файла, который мы хотим получить.
#!/usr/bin/perl
use LWP::UserAgent;
my $max_size = 1024; # размер в байтах
my $field_name = 'http://www'; # URL
my $ua = LWP::UserAgent->new;
$ua->max_size($max_size);
my $req = HTTP::Request->new('GET' => $field_name);
my $res = $ua->request($req);
print $res->content; # файл
Дальше можно ориентироваться по ответу сервера (206 Partial content), но это работает совсем нечасто. Удаленный сервер может сам не знать полный размер файла, если он, например, формируется скриптом.
Тогда можно сделать так. Мы сообщаем серверу, какими кусками хотим получать информацию. Считаем ее количество и в случае превышения разрываем соединение.
#!/usr/bin/perl
use LWP::UserAgent;
my $max_size = 1048576; # размер в байтах
my $field_name = 'http://www'; # URL
my $ua = LWP::UserAgent->new;
my $req = HTTP::Request->new('GET' => $field_name);
#$ua->max_size($max_size);
my $res = $ua->request($req, \&callback, 1024);
my $size = 0;
my $res_content;
sub callback {
my($data, $response, $protocol) = @_;
$size = $size + length($data);
$res_content .= $data;
if($size > $max_size) { die; }
}
print $res_content; # файл
Здесь ориентироваться можно по специальному заголовку в ответе сервера X-Died который появится в случае разрыва соединения.
P.S. При использовании Perl модуля CGI размер всей передаваемой информации (включая файл) контролируется специальной переменной.
#!/usr/bin/perl
use CGI ':standard';
$CGI::POST_MAX = 1048576; # размер в байтах
$CGI::DISABLE_UPLOADS = 1; # запрет загрузки файла
|