# HG changeset patch # User Sergey Kandaurov # Date 1460405185 -10800 # Node ID 894e142ebdf8727abafa15ef324391c9586565d8 # Parent f50ee68042169fc1fc5f9af267066d7ab88506f2 Tests: TODO fastcgi request body end-of-stream. diff --git a/fastcgi_body.t b/fastcgi_body.t --- a/fastcgi_body.t +++ b/fastcgi_body.t @@ -21,10 +21,6 @@ use Test::Nginx; select STDERR; $| = 1; select STDOUT; $| = 1; -eval { require FCGI; }; -plan(skip_all => 'FCGI not installed') if $@; -plan(skip_all => 'win32') if $^O eq 'MSWin32'; - my $t = Test::Nginx->new()->has(qw/http fastcgi/)->plan(5) ->write_file_expand('nginx.conf', <<'EOF'); @@ -57,12 +53,16 @@ EOF ############################################################################### -like(http_get('/'), qr/X-Body: /, 'fastcgi no body'); +like(http_get('/'), qr/X-Body: _eos\x0d?$/ms, 'fastcgi no body'); -like(http_get_length('/', ''), qr/X-Body: /, 'fastcgi empty body'); -like(http_get_length('/', 'foobar'), qr/X-Body: foobar/, 'fastcgi body'); +like(http_get_length('/', ''), qr/X-Body: _eos\x0d?$/ms, 'fastcgi empty body'); +like(http_get_length('/', 'foobar'), qr/X-Body: foobar_eos\x0d?$/ms, + 'fastcgi body'); -like(http(<{content} = substr $$buf, 8, $h->{clen}; + $h->{padding} = substr $$buf, 8 + $h->{clen}, $h->{plen}; + + $$buf = substr $$buf, 8 + $h->{clen} + $h->{plen}; + + return $h; +} + +sub fastcgi_respond($$$$) { + my ($socket, $version, $id, $body) = @_; + + # stdout + $socket->write(pack("CCnnCx", $version, 6, $id, length($body), 0)); + $socket->write($body); + + # close stdout + $socket->write(pack("CCnnCx", $version, 6, $id, 0, 0)); + + # end request + $socket->write(pack("CCnnCx", $version, 3, $id, 8, 0)); + $socket->write(pack("NCxxx", 0, 0)); +} - my $count; - my $body; +sub fastcgi_daemon { + my $server = IO::Socket::INET->new( + Proto => 'tcp', + LocalAddr => '127.0.0.1:8081', + Listen => 5, + Reuse => 1 + ) + or die "Can't create listening socket: $!\n"; + + local $SIG{PIPE} = 'IGNORE'; + + while (my $client = $server->accept()) { + $client->autoflush(1); + Test::Nginx::log_core('||', "fastcgi connection"); + + $client->sysread(my $buf, 1024) or next; - while( $request->Accept() >= 0 ) { - $count++; - read(STDIN, $body, $ENV{'CONTENT_LENGTH'}); + my ($version, $id); + my $body = ''; + + while (my $h = fastcgi_read_record(\$buf)) { + $version = $h->{version}; + $id = $h->{id}; + + Test::Nginx::log_core('||', "fastcgi record: " + . " $h->{version}, $h->{type}, $h->{id}, " + . "'$h->{content}'"); - print <{type} == 5) { + $body .= $h->{content} if $h->{clen} > 0; + + # count stdin end-of-stream + $body .= '_eos' if $h->{clen} == 0; + } + } + + # respond + fastcgi_respond($client, $version, $id, <