EV-YACurl
view release on metacpan or search on metacpan
eg/multipart.pl view on Meta::CPAN
defined(my $pid = fork) or die "fork failed: $!\n";
return ($pid, $url) if $pid;
$SIG{PIPE} = 'IGNORE';
while (my $conn = $listener->accept) {
my $request = read_request($conn) or next;
my $body = '';
my ($boundary) = ($request->{headers}{'content-type'} // '') =~ /boundary=(\S+)/;
if ($boundary) {
for my $part (split /--\Q$boundary\E/, $request->{body}) {
my ($head, $data) = split /\r\n\r\n/, $part, 2;
next unless defined $data && $head =~ /name="([^"]+)"/;
my $name = $1;
$data =~ s/\r\n\z//;
$body .= sprintf "%-8s %-20s %d bytes\n", $name,
$head =~ /filename="([^"]+)"/ ? $1 : '(inline)', length $data;
}
}
t/11-options.t view on Meta::CPAN
use Test::More tests => 26;
use File::Temp qw(tempfile);
use TestServer;
use EV;
use EV::YACurl ':constants';
TestServer::watchdog(120);
my $server = TestServer->new(sub {
my ($request) = @_;
return (200, [], join "\n", $request->{headers}{'content-type'} // '-', $request->{body});
});
my $base = $server->base_url;
sub fetch {
my (%options) = @_;
my ($response, $error, $body) = (undef, undef, '');
my $done = 0;
EV::YACurl->new({})->request(sub { ($response, $error) = @_; $done = 1 }, {
CURLOPT_URL => "$base/",
t/lib/TestServer.pm view on Meta::CPAN
last unless defined $status;
$body = '' unless defined $body;
$headers ||= [];
my $out = "HTTP/1.1 $status " . ($REASON{$status} || 'Status') . "\r\n"
. "Content-Length: " . length($body) . "\r\n";
my $typed = 0;
for (my $i = 0; $i < @$headers; $i += 2) {
$typed = 1 if lc $headers->[$i] eq 'content-type';
$out .= "$headers->[$i]: $headers->[$i + 1]\r\n";
}
$out .= "Content-Type: text/plain\r\n" unless $typed;
$out .= "\r\n$body";
last unless _write_all($conn, $out);
last if lc($request->{headers}{connection} || '') eq 'close';
}
close $conn;
POSIX::_exit(0);
( run in 3.339 seconds using v1.01-cache-2.11-cpan-800906f7e73 )