Feersum
view release on metacpan or search on metacpan
});
}
elsif (($hdrs{'transfer-encoding'}||'') eq 'chunked') {
# Test::More::diag "$name waiting for T-E:chunked body";
my $len = 0;
my ($chunk_reader, $chunk_handler);
$chunk_handler = sub {
if ($len == 0) {
undef $chunk_reader;
undef $chunk_handler;
return $done->();
}
# remove CRLF at end of chunk:
$buf .= substr($_[1],0,-2);
$h->push_read(line => $CRLF, $chunk_reader);
};
$chunk_reader = sub {
my $hex = $_[1];
$len = hex $hex;
if (!defined($len)) {
$err_cb->($h,0,"invalid chunk length '$hex'");
undef $chunk_reader;
undef $chunk_handler;
return;
}
else {
# add two for after-chunk CRLF
$h->push_read(chunk => $len+2, $chunk_handler);
}
};
$h->push_read(line => $CRLF, $chunk_reader);
}
elsif ($hdrs{HTTPVersion} eq '1.0' or
($hdrs{connection}||'') eq 'close')
{
# Test::More::diag "$name waiting for conn:close body";
$h->on_read(sub {
$buf .= substr($_[0]->{rbuf},0,length($_[0]->{rbuf}),'');
});
$h->on_eof($done);
}
else {
$err_cb->($h,0,
"got a response that I don't know how to handle the body for");
return;
}
});
my $host = 'localhost'; #delete $opts{host}
my $headers = delete $opts{headers};
my $proto = delete $opts{proto} || '1.1';
my $body = delete $opts{body} || '';
$headers->{'User-Agent'} ||= 'FeersumSimpleClient/1.0';
$headers->{'Host'} ||= $host.':'.$port;
if (length($body)) {
$headers->{'Content-Length'} ||= length($body);
$headers->{'Content-Type'} ||= 'text/plain';
}
# HTTP/1.1 default is 'keep-alive'
$headers->{'Connection'} ||= 'close' if $proto eq '1.1' && !$opts{keepalive};
my $head = join($CRLF, map {$_.': '.$headers->{$_}} sort keys %$headers);
my $http_req = "$method $uri HTTP/$proto$CRLF";
$strong_h->push_write($http_req);
$strong_h->push_write($head.$CRLF.$CRLF.$body)
unless $opts{skip_head};
# $http_req =~ s/$CRLF/<CRLF>\n/sg;
# Test::More::diag($http_req);
return $strong_h;
}
1;
( run in 0.738 second using v1.01-cache-2.11-cpan-d7a12ab2c7f )