# HG changeset patch # User Sergey Kandaurov # Date 1405675195 -14400 # Node ID 60888e2c3f5a123f7ab1ecb89fc933aae1409dd1 # Parent 8b4a6b8691ebd0ee6cb0fda9e1438f06d47921d1 Tests: new http_start() and http_end() functions. When used together, they allow to break an http request into two separate send/receive phases and are used to run long requests asynchronously. An http() "start" extra flag introduced as a convenience shortcut. diff --git a/http_resolver.t b/http_resolver.t --- a/http_resolver.t +++ b/http_resolver.t @@ -15,7 +15,7 @@ use Test::More; BEGIN { use FindBin; chdir($FindBin::Bin); } use lib 'lib'; -use Test::Nginx; +use Test::Nginx qw/ :DEFAULT http_end /; ############################################################################### @@ -94,7 +94,7 @@ EOF # schedule resend test, which takes abound 5 seconds to complete -my $s = http_start('id.example.net', '/resend'); +my $s = http_host_header('id.example.net', '/resend', start => 1); like(http_host_header('a.example.net', '/'), qr/200 OK/, 'A'); @@ -231,8 +231,8 @@ like(http_end($s), qr/200 OK/, 'resend a ############################################################################### sub http_host_header { - my ($host, $uri) = @_; - return http(<new( - Proto => 'tcp', - PeerAddr => '127.0.0.1:8080' - ); - log_out($request); - $s->print($request); - alarm(0); - }; - alarm(0); - if ($@) { - log_in("died: $@"); - return undef; - } - return $s; -} - -sub http_end { - my ($s) = @_; - my $reply; - - eval { - local $SIG{ALRM} = sub { die "timeout\n" }; - local $SIG{PIPE} = sub { die "sigpipe\n" }; - alarm(3); - local $/; - $reply = $s->getline(); - log_in($reply); - alarm(0); - }; - alarm(0); - if ($@) { - log_in("died: $@"); - return undef; - } - return $reply; -} - ############################################################################### sub reply_handler { diff --git a/lib/Test/Nginx.pm b/lib/Test/Nginx.pm --- a/lib/Test/Nginx.pm +++ b/lib/Test/Nginx.pm @@ -12,7 +12,7 @@ use strict; use base qw/ Exporter /; our @EXPORT = qw/ log_in log_out http http_get http_head /; -our @EXPORT_OK = qw/ http_gzip_request http_gzip_like /; +our @EXPORT_OK = qw/ http_gzip_request http_gzip_like http_start http_end /; our %EXPORT_TAGS = ( gzip => [ qw/ http_gzip_request http_gzip_like / ] ); @@ -455,14 +455,23 @@ EOF sub http($;%) { my ($request, %extra) = @_; - my $reply; + + my $s = http_start($request, %extra); + + return $s if $extra{start} or !defined $s; + return http_end($s); +} + +sub http_start($;%) { + my ($request, %extra) = @_; + my $s; eval { local $SIG{ALRM} = sub { die "timeout\n" }; local $SIG{PIPE} = sub { die "sigpipe\n" }; alarm(5); - my $s = $extra{socket} || IO::Socket::INET->new( + $s = $extra{socket} || IO::Socket::INET->new( Proto => 'tcp', PeerAddr => '127.0.0.1:8080' ) @@ -479,6 +488,26 @@ sub http($;%) { $s->print($extra{body}); } + alarm(0); + }; + alarm(0); + if ($@) { + log_in("died: $@"); + return undef; + } + + return $s; +} + +sub http_end($;%) { + my ($s) = @_; + my $reply; + + eval { + local $SIG{ALRM} = sub { die "timeout\n" }; + local $SIG{PIPE} = sub { die "sigpipe\n" }; + alarm(5); + local $/; $reply = $s->getline(); diff --git a/limit_conn.t b/limit_conn.t --- a/limit_conn.t +++ b/limit_conn.t @@ -104,7 +104,7 @@ http_get('/w'); # same and other zones in different locations -my $s = http_start('/w'); +my $s = http_get('/w', start => 1); like(http_get('/'), qr/^HTTP\/1.. 503 /, 'rejected'); like(http_get('/1'), qr/^HTTP\/1.. 503 /, 'rejected different location'); unlike(http_get('/zone'), qr/^HTTP\/1.. 503 /, 'passed different zone'); @@ -114,7 +114,7 @@ unlike(http_get('/1'), qr/^HTTP\/1.. 503 # custom error code and log level -$s = http_start('/custom/w'); +$s = http_get('/custom/w', start => 1); like(http_get('/custom'), qr/^HTTP\/1.. 501 /, 'limit_conn_status'); like(`grep -F '[info]' ${\($t->testdir())}/error.log`, @@ -123,7 +123,7 @@ like(`grep -F '[info]' ${\($t->testdir() # limit_zone -$s = http_start('/legacy/w'); +$s = http_get('/legacy/w', start => 1); like(http_get('/legacy'), qr/^HTTP\/1.. 503 /, 'legacy rejected'); $s->close; @@ -131,36 +131,8 @@ unlike(http_get('/legacy'), qr/^HTTP\/.. # limited after unlimited -$s = http_start('/w'); +$s = http_get('/w', start => 1); like(http_get('/unlim'), qr/404 Not Found/, 'unlimited passed'); like(http_get('/'), qr/503 Service/, 'limited rejected'); ############################################################################### - -sub http_start { - my ($uri) = @_; - - my $s; - my $request = "GET $uri HTTP/1.0" . CRLF . CRLF; - - eval { - local $SIG{ALRM} = sub { die "timeout\n" }; - local $SIG{PIPE} = sub { die "sigpipe\n" }; - alarm(3); - $s = IO::Socket::INET->new( - Proto => 'tcp', - PeerAddr => '127.0.0.1:8080' - ); - log_out($request); - $s->print($request); - alarm(0); - }; - alarm(0); - if ($@) { - log_in("died: $@"); - return undef; - } - return $s; -} - -############################################################################### diff --git a/proxy_cache_lock.t b/proxy_cache_lock.t --- a/proxy_cache_lock.t +++ b/proxy_cache_lock.t @@ -15,7 +15,7 @@ use Socket qw/ CRLF /; BEGIN { use FindBin; chdir($FindBin::Bin); } use lib 'lib'; -use Test::Nginx; +use Test::Nginx qw/ :DEFAULT http_end /; ############################################################################### @@ -87,7 +87,7 @@ for my $i (1 .. 5) { my @sockets; for my $i (1 .. 5) { - $sockets[$i] = http_start('/par1'); + $sockets[$i] = http_get('/par1', start => 1); } for my $i (1 .. 5) { @@ -99,7 +99,7 @@ like(http_get('/par1'), qr/request 1/, ' # parallel requests with cache lock timeout for my $i (1 .. 3) { - $sockets[$i] = http_start('/timeout'); + $sockets[$i] = http_get('/timeout', start => 1); } for my $i (1 .. 3) { @@ -111,7 +111,7 @@ like(http_get('/timeout'), qr/request 3/ # no lock for my $i (1 .. 3) { - $sockets[$i] = http_start('/nolock'); + $sockets[$i] = http_get('/nolock', start => 1); } for my $i (1 .. 3) { @@ -122,53 +122,6 @@ like(http_get('/nolock'), qr/request 3/, ############################################################################### -sub http_start { - my ($uri) = @_; - - my $s; - my $request = "GET $uri HTTP/1.0" . CRLF . CRLF; - - eval { - local $SIG{ALRM} = sub { die "timeout\n" }; - local $SIG{PIPE} = sub { die "sigpipe\n" }; - alarm(3); - $s = IO::Socket::INET->new( - Proto => 'tcp', - PeerAddr => '127.0.0.1:8080' - ); - log_out($request); - $s->print($request); - alarm(0); - }; - alarm(0); - if ($@) { - log_in("died: $@"); - return undef; - } - return $s; -} - -sub http_end { - my ($s) = @_; - my $reply; - - eval { - local $SIG{ALRM} = sub { die "timeout\n" }; - local $SIG{PIPE} = sub { die "sigpipe\n" }; - alarm(3); - local $/; - $reply = $s->getline(); - log_in($reply); - alarm(0); - }; - alarm(0); - if ($@) { - log_in("died: $@"); - return undef; - } - return $reply; -} - ############################################################################### sub http_fake_daemon { diff --git a/upstream_least_conn.t b/upstream_least_conn.t --- a/upstream_least_conn.t +++ b/upstream_least_conn.t @@ -16,7 +16,7 @@ use Socket qw/ CRLF /; BEGIN { use FindBin; chdir($FindBin::Bin); } use lib 'lib'; -use Test::Nginx; +use Test::Nginx qw/ :DEFAULT http_end /; ############################################################################### @@ -88,7 +88,7 @@ sub parallel { my (@sockets, %ports); for (1 .. $count) { - push(@sockets, http_start($uri)); + push(@sockets, http_get($uri, start => 1)); select undef, undef, undef, 0.1; } @@ -102,53 +102,6 @@ sub parallel { return join ', ', map { $_ . ": " . $ports{$_} } sort keys %ports; } -sub http_start { - my ($uri) = @_; - - my $s; - my $request = "GET $uri HTTP/1.0" . CRLF . CRLF; - - eval { - local $SIG{ALRM} = sub { die "timeout\n" }; - local $SIG{PIPE} = sub { die "sigpipe\n" }; - alarm(3); - $s = IO::Socket::INET->new( - Proto => 'tcp', - PeerAddr => '127.0.0.1:8080' - ); - log_out($request); - $s->print($request); - alarm(0); - }; - alarm(0); - if ($@) { - log_in("died: $@"); - return undef; - } - return $s; -} - -sub http_end { - my ($s) = @_; - my $reply; - - eval { - local $SIG{ALRM} = sub { die "timeout\n" }; - local $SIG{PIPE} = sub { die "sigpipe\n" }; - alarm(3); - local $/; - $reply = $s->getline(); - log_in($reply); - alarm(0); - }; - alarm(0); - if ($@) { - log_in("died: $@"); - return undef; - } - return $reply; -} - ############################################################################### sub http_daemon {