LWP :: UserAgent API не предназначен для отправки потока, но он способен сделать это с минимальным взломом.
use strict;
use warnings qw( all );
use HTTP::Request::Common qw( POST );
use LWP::UserAgent qw( );
my $ua = LWP::UserAgent->new();
# Don't provide any content.
my $request = POST('http://stackoverflow.org/junk',
Content_Type => 'application/xml',
);
# POST() insists on adding a Content-Length header.
# We need to remove it to get a chunked request.
$request->headers->remove_header('Content-Length');
# Here's where we provide the stream generator.
my $buffer = 'abc\n';
$request->content(sub {
return undef if !length($buffer); # Return undef when done.
return substr($buffer, 0, length($buffer), ''); # Return a chunk of data otherwise.
});
my $response = $ua->request($request);
print($response->status_line);
Используя прокси (Fiddler), мы видим, что это действительно такотправьте разделенный запрос:
Нет смысла использовать разделенный запрос, если у вас уже есть весь документ под рукой, как в приведенном вами примере.Вместо этого, скажем, хотел загрузить выходные данные какого-либо внешнего инструмента, поскольку он производил свои выходные данные.Для этого вы можете использовать следующее:
open(my $pipe, '-|:raw', 'some_tool');
$request->content(sub {
my $rv = sysread($pipe, my $buf, 64*1024);
die $! if !defined($rv);
return undef if !$rv;
return $buf;
});