From 58daab21cd043e1dc37024a7f99b396788372918 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sat, 9 Mar 2024 14:19:48 +0100 Subject: Merging upstream version 1.44.3. Signed-off-by: Daniel Baumann --- web/server/h2o/libh2o/t/50fastcgi.t | 139 ++++++++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 web/server/h2o/libh2o/t/50fastcgi.t (limited to 'web/server/h2o/libh2o/t/50fastcgi.t') diff --git a/web/server/h2o/libh2o/t/50fastcgi.t b/web/server/h2o/libh2o/t/50fastcgi.t new file mode 100644 index 000000000..bdec377b4 --- /dev/null +++ b/web/server/h2o/libh2o/t/50fastcgi.t @@ -0,0 +1,139 @@ +use strict; +use warnings; +use Digest::MD5 qw(md5_hex); +use File::Temp qw(tempdir); +use Net::EmptyPort qw(check_port empty_port); +use Test::More; +use t::Util; + +plan skip_all => 'curl not found' + unless prog_exists('curl'); +plan skip_all => 'plackup not found' + unless prog_exists('plackup'); +plan skip_all => 'cannot run perl -MPlack::Handler::FCGI' + if system("perl -MPlack::Handler::FCGI /dev/null > /dev/null 2>&1") != 0; + +my $tempdir = tempdir(CLEANUP => 1); +my $fcgi_port = empty_port(); + +# gather information of test data +my %files = map { do { + my $fn = DOC_ROOT . "/$_"; + +($_ => { size => (stat $fn)[7], md5 => md5_file($fn) }); +} } qw(index.txt halfdome.jpg); + +sub doit { + my ($tcp, $keepalive) = @_; + subtest "tcp:$tcp,keepalive:$keepalive" => sub { + # spawn upstream + unlink "$tempdir/fcgi.sock"; + my $upstream = spawn_server( + argv => [ + qw(plackup -s FCGI --access-log /dev/null --listen), + ($tcp ? ":$fcgi_port" : "$tempdir/fcgi.sock"), + ASSETS_DIR . "/upstream.psgi", + ], + is_ready => sub { + $tcp ? check_port($fcgi_port) : -e "$tempdir/fcgi.sock"; + }, + ); + # spawn h2o + my $server = spawn_h2o(<< "EOT"); +hosts: + default: + paths: + "/": + fastcgi.connect: + @{[$tcp ? "host: 127.0.0.1" : ""]} + port: @{[$tcp ? $fcgi_port : "$tempdir/fcgi.sock"]} + type: @{[$tcp ? "tcp" : "unix"]} +fastcgi.timeout.keepalive: @{[$keepalive ? 5000 : 0]} +EOT + # the tests + subtest 'files' => sub { + run_with_curl($server, sub { + my ($proto, $port, $curl) = @_; + for my $file (sort keys %files) { + my $content = `$curl --silent --show-error $proto://127.0.0.1:$port/$file`; + is length($content), $files{$file}->{size}, "$proto://127.0.0.1/$file (size)"; + is md5_hex($content), $files{$file}->{md5}, "$proto://127.0.0.1/$file (md5)"; + } + }); + }; + subtest 'echo' => sub { + # send header that exceeds the max. length fcgi record (the size of the response also exceeds the record size, and uses chunked encoding) + run_with_curl($server, sub { + my ($proto, $port, $curl) = @_; + plan skip_all => "skip due to curl bug #659" + if $curl =~ /--http2/; + my $content = `$curl --silent --show-error -H foo:@{["0123456789"x7000]} $proto://127.0.0.1:$port/echo-headers`; + like $content, qr/^foo: (0123456789){7000,7000}$/mi; + if ($proto eq 'https') { + like $content, qr/^https: on$/m; + } else { + unlike $content, qr/^https: on$/m; + } + }); + }; + subtest 'cookie-merge' => sub { + plan skip_all => "curl does not support HTTP/2" + unless curl_supports_http2(); + plan skip_all => "cowardly skipping to avoid https://github.com/plack/Plack/pull/511; unless PLACK_ENV=deployment is set" + unless $ENV{PLACK_ENV} && $ENV{PLACK_ENV} eq 'deployment'; + my $content = `curl --http2 --silent --show-error --insecure -H "cookie:a=b;c=d" https://127.0.0.1:$server->{tls_port}/echo-headers`; + like $content, qr/^cookie: a=b;\s*c=d$/mi; + }; + delete $server->{guard}; + }; +} + +doit(0, 0); +doit(1, 0); +doit(0, 1); +doit(1, 1); + +subtest 'httpoxy' => sub { + my $doit = sub { + my ($drop, $cb) = @_; + unlink "$tempdir/fcgi.sock"; + my $upstream = spawn_server( + argv => [ + qw(plackup -s FCGI --access-log /dev/null --listen), + "$tempdir/fcgi.sock", + ASSETS_DIR . "/upstream.psgi", + ], + is_ready => sub { + -e "$tempdir/fcgi.sock"; + }, + ); + # spawn h2o + my $dropconf = $drop ? << 'EOT' : ""; + setenv: + HTTP_PROXY: "" +EOT + my $server = spawn_h2o(<< "EOT"); +hosts: + default: + paths: + "/": + fastcgi.connect: + port: $tempdir/fcgi.sock + type: unix +$dropconf +EOT + run_with_curl($server, sub { + my ($proto, $port, $curl) = @_; + my $content = `$curl --silent --show-error -H proxy:foobar $proto://127.0.0.1:$port/echo-headers`; + $cb->($content); + }); + }; + $doit->(undef, sub { + like $_[0], qr{^proxy: foobar$}mi, "keep"; + }); + $doit->(1, sub { + like $_[0], qr{^proxy: $}mi, "drop"; + }); +}; + + +done_testing(); -- cgit v1.2.3