|
Packit |
3f4df8 |
#!perl
|
|
Packit |
3f4df8 |
|
|
Packit |
3f4df8 |
use strict;
|
|
Packit |
3f4df8 |
use warnings;
|
|
Packit |
3f4df8 |
use File::Basename;
|
|
Packit |
3f4df8 |
use Test::More 0.88;
|
|
Packit |
3f4df8 |
use lib 't';
|
|
Packit |
3f4df8 |
use Util qw[
|
|
Packit |
3f4df8 |
tmpfile monkey_patch dir_list clear_socket_source set_socket_source
|
|
Packit |
3f4df8 |
$CRLF
|
|
Packit |
3f4df8 |
];
|
|
Packit |
3f4df8 |
use HTTP::Tiny;
|
|
Packit |
3f4df8 |
our $can_read;
|
|
Packit |
3f4df8 |
|
|
Packit |
3f4df8 |
BEGIN {
|
|
Packit |
3f4df8 |
no warnings qw/redefine once/;
|
|
Packit |
3f4df8 |
monkey_patch();
|
|
Packit |
3f4df8 |
*HTTP::Tiny::Handle::can_read = sub { $can_read++ };
|
|
Packit |
3f4df8 |
}
|
|
Packit |
3f4df8 |
|
|
Packit |
3f4df8 |
my $response = <<'RESPONSE';
|
|
Packit |
3f4df8 |
HTTP/1.1 200 OK
|
|
Packit |
3f4df8 |
Date: Thu, 03 Feb 1994 00:00:00 GMT
|
|
Packit |
3f4df8 |
Content-Type: text/html
|
|
Packit |
3f4df8 |
Content-Length: 10
|
|
Packit |
3f4df8 |
|
|
Packit |
3f4df8 |
0123456789
|
|
Packit |
3f4df8 |
|
|
Packit |
3f4df8 |
RESPONSE
|
|
Packit |
3f4df8 |
|
|
Packit |
3f4df8 |
trim($response);
|
|
Packit |
3f4df8 |
|
|
Packit |
3f4df8 |
my $h;
|
|
Packit |
3f4df8 |
|
|
Packit |
3f4df8 |
new_ht();
|
|
Packit |
3f4df8 |
test_ht( "Keep-alive", 1, 'http://foo.com' );
|
|
Packit |
3f4df8 |
|
|
Packit |
3f4df8 |
new_ht();
|
|
Packit |
3f4df8 |
test_ht( "Different scheme", 0, 'https://foo.com' );
|
|
Packit |
3f4df8 |
|
|
Packit |
3f4df8 |
new_ht();
|
|
Packit |
3f4df8 |
test_ht( "Different host", 0, 'http://bar.com' );
|
|
Packit |
3f4df8 |
|
|
Packit |
3f4df8 |
new_ht();
|
|
Packit |
3f4df8 |
test_ht( "Different port", 0, 'http://foo.com:8000' );
|
|
Packit |
3f4df8 |
|
|
Packit |
3f4df8 |
new_ht();
|
|
Packit |
3f4df8 |
$h->timeout(30);
|
|
Packit |
3f4df8 |
test_ht( "Different timeout", 0, 'http://foo.com' );
|
|
Packit |
3f4df8 |
|
|
Packit |
3f4df8 |
new_ht();
|
|
Packit |
3f4df8 |
$h->timeout(60);
|
|
Packit |
3f4df8 |
test_ht( "Same timeout", 1, 'http://foo.com' );
|
|
Packit |
3f4df8 |
|
|
Packit |
3f4df8 |
new_ht();
|
|
Packit |
3f4df8 |
$h->default_headers({ 'X-Foo' => 'Bar' });
|
|
Packit |
3f4df8 |
test_ht( "Default headers change", 1, 'http://foo.com' );
|
|
Packit |
3f4df8 |
|
|
Packit |
3f4df8 |
new_ht();
|
|
Packit |
3f4df8 |
$h->{handle}->close;
|
|
Packit |
3f4df8 |
test_ht( "Socket closed", 0, 'http://foo.com' );
|
|
Packit |
3f4df8 |
|
|
Packit |
3f4df8 |
for my $file ( dir_list( "corpus", qr/^keepalive/ ) ) {
|
|
Packit |
3f4df8 |
my $label = basename($file);
|
|
Packit |
3f4df8 |
my $data = do { local ( @ARGV, $/ ) = $file; <> };
|
|
Packit |
3f4df8 |
my ( $title, $ok, $response ) = map { trim($_) } split /--+/, $data;
|
|
Packit |
3f4df8 |
new_ht();
|
|
Packit |
3f4df8 |
clear_socket_source();
|
|
Packit |
3f4df8 |
set_socket_source( tmpfile(), tmpfile($response) );
|
|
Packit |
3f4df8 |
$h->request( 'POST', 'http://foo.com', { content => 'xx' } );
|
|
Packit |
3f4df8 |
is !!$h->{handle}, !!$ok, "$label - $title";
|
|
Packit |
3f4df8 |
}
|
|
Packit |
3f4df8 |
|
|
Packit |
3f4df8 |
sub test_ht {
|
|
Packit |
3f4df8 |
my $title = shift;
|
|
Packit |
3f4df8 |
my $result = !!shift();
|
|
Packit |
3f4df8 |
my $url = shift;
|
|
Packit |
3f4df8 |
|
|
Packit |
3f4df8 |
clear_socket_source();
|
|
Packit |
3f4df8 |
set_socket_source( tmpfile(), tmpfile($response) );
|
|
Packit |
3f4df8 |
$can_read = 0 if $result;
|
|
Packit |
3f4df8 |
my $old = $h->{handle} || 'old';
|
|
Packit |
3f4df8 |
$h->request( 'POST', $url, { content => 'xx' } );
|
|
Packit |
3f4df8 |
my $new = $h->{handle} || 'new';
|
|
Packit |
3f4df8 |
is $old eq $new, $result, $title;
|
|
Packit |
3f4df8 |
}
|
|
Packit |
3f4df8 |
|
|
Packit |
3f4df8 |
sub new_ht {
|
|
Packit |
3f4df8 |
$h = HTTP::Tiny->new( keep_alive => 1, @_ );
|
|
Packit |
3f4df8 |
$can_read = 1;
|
|
Packit |
3f4df8 |
clear_socket_source();
|
|
Packit |
3f4df8 |
set_socket_source( tmpfile(), tmpfile($response) );
|
|
Packit |
3f4df8 |
$h->request( 'POST', 'http://foo.com' );
|
|
Packit |
3f4df8 |
}
|
|
Packit |
3f4df8 |
|
|
Packit |
3f4df8 |
sub trim { $_[0] =~ s/^\s+//; $_[0] =~ s/\s+$//; return $_ }
|
|
Packit |
3f4df8 |
|
|
Packit |
3f4df8 |
done_testing;
|
|
Packit |
3f4df8 |
|