From b719e629afbc9f332ddc6efeee6a65fdce2a723c Mon Sep 17 00:00:00 2001 From: Jan Kneschke Date: Sun, 27 Feb 2005 22:01:13 +0000 Subject: [PATCH] moved most of the tests to run-tests.pl - more tests - less code to maintain - more speed git-svn-id: svn+ssh://svn.lighttpd.net/lighttpd/trunk@42 152afb58-edef-0310-8abb-c4023f1b3aa9 --- tests/Makefile.am | 84 +-- tests/auth-01.sh | 16 - tests/auth-02.sh | 17 - tests/auth-03.sh | 17 - tests/basic-01.sh | 16 - tests/basic-02.sh | 18 - tests/basic-03.sh | 17 - tests/basic-05.sh | 17 - tests/basic-06.sh | 16 - tests/basic-07.sh | 23 - tests/basic-08.sh | 16 - tests/basic-09.sh | 16 - tests/basic-10.sh | 21 - tests/basic-11.sh | 21 - tests/broken-header-01.sh | 18 - tests/broken-key-01.sh | 17 - tests/broken-key-02.sh | 17 - tests/broken-key-03.sh | 17 - tests/broken-key-04.sh | 18 - tests/cgi-01.sh | 16 - tests/cgi-02.sh | 17 - tests/cgi-03.sh | 17 - tests/content-01.sh | 32 -- tests/content-02.sh | 32 -- tests/content-03.sh | 32 -- tests/content-04.sh | 36 -- tests/content-length-01.sh | 18 - tests/content-length-02.sh | 18 - tests/content-length-03.sh | 18 - tests/content-length-04.sh | 18 - tests/content-length-05.sh | 18 - tests/continue-01.sh | 18 - tests/docroot/123/dummyfile.bla | 2 +- tests/host-01.sh | 17 - tests/host-02.sh | 16 - tests/host-03.sh | 17 - tests/host-04.sh | 17 - tests/host-05.sh | 17 - tests/http11-01.sh | 17 - tests/http11-02.sh | 18 - tests/http11-03.sh | 16 - tests/leak-01.sh | 17 - tests/leak-02.sh | 17 - tests/leak-03.sh | 17 - tests/leak-04.sh | 17 - tests/leak-05.sh | 17 - tests/leak-06.sh | 17 - tests/leak-07.sh | 17 - tests/leak-08.sh | 17 - tests/leak-09.sh | 17 - tests/leak-10.sh | 17 - tests/leak-11.sh | 17 - tests/leak-12.sh | 17 - tests/leak-13.sh | 17 - tests/leak-14.sh | 17 - tests/leak-15.sh | 17 - tests/leak-16.sh | 17 - tests/leak-17.sh | 17 - tests/missing-01.sh | 16 - tests/missing-02.sh | 16 - tests/post-01.sh | 16 - tests/post-02.sh | 18 - tests/redirect-01.sh | 17 - tests/redirect-02.sh | 17 - tests/redirect-03.sh | 17 - tests/run-tests.pl | 980 ++++++++++++++++++++++++++++++++ 66 files changed, 984 insertions(+), 1231 deletions(-) delete mode 100755 tests/auth-01.sh delete mode 100755 tests/auth-02.sh delete mode 100755 tests/auth-03.sh delete mode 100755 tests/basic-01.sh delete mode 100755 tests/basic-02.sh delete mode 100755 tests/basic-03.sh delete mode 100755 tests/basic-05.sh delete mode 100755 tests/basic-06.sh delete mode 100755 tests/basic-07.sh delete mode 100755 tests/basic-08.sh delete mode 100755 tests/basic-09.sh delete mode 100755 tests/basic-10.sh delete mode 100755 tests/basic-11.sh delete mode 100755 tests/broken-header-01.sh delete mode 100755 tests/broken-key-01.sh delete mode 100755 tests/broken-key-02.sh delete mode 100755 tests/broken-key-03.sh delete mode 100755 tests/broken-key-04.sh delete mode 100755 tests/cgi-01.sh delete mode 100755 tests/cgi-02.sh delete mode 100755 tests/cgi-03.sh delete mode 100755 tests/content-01.sh delete mode 100755 tests/content-02.sh delete mode 100755 tests/content-03.sh delete mode 100755 tests/content-04.sh delete mode 100755 tests/content-length-01.sh delete mode 100755 tests/content-length-02.sh delete mode 100755 tests/content-length-03.sh delete mode 100755 tests/content-length-04.sh delete mode 100755 tests/content-length-05.sh delete mode 100755 tests/continue-01.sh delete mode 100755 tests/host-01.sh delete mode 100755 tests/host-02.sh delete mode 100755 tests/host-03.sh delete mode 100755 tests/host-04.sh delete mode 100755 tests/host-05.sh delete mode 100755 tests/http11-01.sh delete mode 100755 tests/http11-02.sh delete mode 100755 tests/http11-03.sh delete mode 100755 tests/leak-01.sh delete mode 100755 tests/leak-02.sh delete mode 100755 tests/leak-03.sh delete mode 100755 tests/leak-04.sh delete mode 100755 tests/leak-05.sh delete mode 100755 tests/leak-06.sh delete mode 100755 tests/leak-07.sh delete mode 100755 tests/leak-08.sh delete mode 100755 tests/leak-09.sh delete mode 100755 tests/leak-10.sh delete mode 100755 tests/leak-11.sh delete mode 100755 tests/leak-12.sh delete mode 100755 tests/leak-13.sh delete mode 100755 tests/leak-14.sh delete mode 100755 tests/leak-15.sh delete mode 100755 tests/leak-16.sh delete mode 100755 tests/leak-17.sh delete mode 100755 tests/missing-01.sh delete mode 100755 tests/missing-02.sh delete mode 100755 tests/post-01.sh delete mode 100755 tests/post-02.sh delete mode 100755 tests/redirect-01.sh delete mode 100755 tests/redirect-02.sh delete mode 100755 tests/redirect-03.sh create mode 100755 tests/run-tests.pl diff --git a/tests/Makefile.am b/tests/Makefile.am index 859ab63a..30bf7160 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -1,106 +1,28 @@ # lighttpd.conf and conformance.pl expect this directory testdir=/tmp/lighttpd/ +if CHECK_WITH_FASTCGI check_PROGRAMS=fcgi-auth fcgi_auth_SOURCES=fcgi-auth.c fcgi_auth_LDADD=-lfcgi +endif TESTS=\ prepare.sh \ -basic-01.sh \ -basic-02.sh \ -basic-03.sh \ -basic-05.sh \ -basic-06.sh \ -basic-07.sh \ -basic-08.sh \ -basic-09.sh \ -basic-10.sh \ -basic-11.sh \ -bug-urldecode-00.sh \ +check.pl \ bug-03.sh \ bug-06.sh \ bug-12.sh \ -bug-14.sh \ -bug-15.sh \ -bug-15-2.sh \ -bug-15-3.sh \ -broken-header-01.sh \ -content-length-01.sh \ -content-length-02.sh \ -content-length-03.sh \ -content-length-04.sh \ -content-length-05.sh \ -head-01.sh \ -post-01.sh \ -post-02.sh \ -host-01.sh \ -host-02.sh \ -host-03.sh \ -host-04.sh \ -host-05.sh \ -http11-01.sh \ -http11-02.sh \ -http11-03.sh \ -missing-01.sh \ -missing-02.sh \ large-header-01.sh \ -accessdeny-01.sh \ -cgi-01.sh \ -cgi-02.sh \ -cgi-03.sh \ compress-01.sh \ compress-02.sh \ compress-03.sh \ compress-04.sh \ -fastcgi-01.sh \ -fastcgi-02.sh \ -fastcgi-03.sh \ -fastcgi-04.sh \ -fastcgi-05.sh \ -fastcgi-06.sh \ -fastcgi-07.sh \ -fastcgi-08.sh \ -fastcgi-09.sh \ fastcgi-10.sh \ fastcgi-11.sh \ fastcgi-12.sh \ fastcgi-13.sh \ -auth-01.sh \ -auth-02.sh \ -auth-03.sh \ -content-01.sh \ -content-02.sh \ -content-03.sh \ -content-04.sh \ -leak-01.sh \ -leak-02.sh \ -leak-03.sh \ -leak-04.sh \ -leak-05.sh \ -leak-06.sh \ -leak-07.sh \ -leak-08.sh \ -leak-09.sh \ -leak-10.sh \ -leak-11.sh \ -leak-12.sh \ -leak-13.sh \ -leak-14.sh \ -leak-15.sh \ -leak-16.sh \ -leak-17.sh \ -redirect-01.sh \ -redirect-02.sh \ -redirect-03.sh \ -pathinfo-01.sh \ -pathinfo-02.sh \ -broken-key-01.sh \ -broken-key-02.sh \ -broken-key-03.sh \ -broken-key-04.sh \ -continue-01.sh \ cleanup.sh CONFS=fastcgi-10.conf \ diff --git a/tests/auth-01.sh b/tests/auth-01.sh deleted file mode 100755 index 59d5e7cd..00000000 --- a/tests/auth-01.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/sh - -test x$srcdir = x && srcdir=. - -. $srcdir/testbase.sh - -prepare_test - -cat > $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < /dev/null; then - echo -n -else - printf "%-40s" "Getting PHP code" - exit 77 -fi - -test x$srcdir = x && srcdir=. - -docroot=/tmp/lighttpd/servers/123.example.org/pages/ -reqfile=phpinfo.php -test -d $docroot || exit 77 - -. $srcdir/testbase.sh - -prepare_test - -cat > $TMPFILE < /dev/null -fi - -run_test_exit diff --git a/tests/content-length-01.sh b/tests/content-length-01.sh deleted file mode 100755 index 1d3e4b88..00000000 --- a/tests/content-length-01.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/sh - -test x$srcdir = x && srcdir=. - -. $srcdir/testbase.sh - -prepare_test - -cat > $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE <ۆ[Q :=H+>{fKaO€od $ͭUay&QW$qu~&o^5&.04gt.n ҅O28%W @;8&4 k9h/ڙZ m[߿0L@'^jfbJ cA/i>.Pxۖi2Hʇḻ48'Zk&!?@F-oj&}`1ͫ!ϸ \ No newline at end of file +12345 diff --git a/tests/host-01.sh b/tests/host-01.sh deleted file mode 100755 index 95b36176..00000000 --- a/tests/host-01.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/sh - -test x$srcdir = x && srcdir=. - -. $srcdir/testbase.sh - -prepare_test - -cat > $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < $TMPFILE < 87; + + +my $testname; +my @request; +my @response; +my $configfile = 'lighttpd.conf'; +my $lighttpd_path = '../src/lighttpd'; +my $pidfile = '/tmp/lighttpd/lighttpd.pid'; +my $pidoffile = '/tmp/lighttpd/pidof.pid'; + +sub pidof { + my $prog = $_[0]; + + system("ps ax | grep $prog | awk '{ print \$1 }' > $pidoffile") or + system("ps -ef | grep $prog | awk '{ print \$1 }' > $pidoffile") or + return -1; + + open F, $pidfile or return -1; + my $pid = ; + close F; + + return $pid; +} + +sub stop_proc { + open F, $pidfile or return -1; + my $pid = ; + close F; + + kill('TERM',$pid) or return -1; + + return 0; +} + + +sub start_proc { + # kill old proc if necessary + stop_proc; + + unlink($pidfile); + system($lighttpd_path." -f ".$configfile); + + if (-e $pidfile) { + return 0; + } else { + return -1; + } +} + +sub handle_http { + my $EOL = "\015\012"; + my $BLANK = $EOL x 2; + my $port = 2048; + my $host = "127.0.0.1"; + + my $remote = + IO::Socket::INET->new(Proto => "tcp", + PeerAddr => $host, + PeerPort => $port) + or return -1; + + $remote->autoflush(1); + + foreach(@request) { + # pipeline requests + s/\r//g; + s/\n/$EOL/g; + + print $remote $_.$BLANK; + } + + my $lines = ""; + + # read everything + while(<$remote>) { + $lines .= $_; + } + + close $remote; + + my $href; + foreach $href (@response) { + # first line is always response header + my %resp_hdr; + my $resp_body; + my $resp_line; + my $conditions = $_; + + for (my $ln = 0; defined $lines; $ln++) { + (my $line, $lines) = split($EOL, $lines, 2); + + # header finished + last if(length($line) == 0); + + if ($ln == 0) { + # response header + $resp_line = $line; + } else { + # response vars + + if ($line =~ /^([^:]+):\s*(.+)$/) { + (my $h = $1) =~ tr/[A-Z]/[a-z]/; + + $resp_hdr{$h} = $2; + } else { + return -1; + } + } + } + + # check length + if (defined $resp_hdr{"content-length"}) { + ($resp_body, $lines) = split("^.".$resp_hdr{"content-length"}, $lines, 2); + } else { + $resp_body = $lines; + undef $lines; + } + + # check conditions + if ($resp_line =~ /^(HTTP\/1\.[01]) ([0-9]{3}) .+$/) { + if ($href->{'HTTP-Protocol'} ne $1) { + diag(sprintf("proto failed: expected '%s', got '%s'\n", $href->{'HTTP-Protocol'}, $1)); + return -1; + } + if ($href->{'HTTP-Status'} ne $2) { + diag(sprintf("status failed: expected '%s', got '%s'\n", $href->{'HTTP-Status'}, $2)); + return -1; + } + } else { + return -1; + } + + if (defined $href->{'HTTP-Content'}) { + if ($href->{'HTTP-Content'} ne $resp_body) { + diag(sprintf("body failed: expected '%s', got '%s'\n", $href->{'HTTP-Content'}, $resp_body)); + return -1; + } + } + + if (defined $href->{'-HTTP-Content'}) { + if (defined $resp_body && $resp_body ne '') { + diag(sprintf("body failed: expected empty body, got '%s'\n", $resp_body)); + return -1; + } + } + + foreach (keys %{ $href }) { + next if $_ eq 'HTTP-Protocol'; + next if $_ eq 'HTTP-Status'; + next if $_ eq 'HTTP-Content'; + next if $_ eq '-HTTP-Content'; + + (my $k = $_) =~ tr/[A-Z]/[a-z]/; + + my $no_val = 0; + + if (substr($k, 0, 1) eq '+') { + $k = substr($k, 1); + $no_val = 1; + + } + + if (!defined $resp_hdr{$k}) { + diag(sprintf("required header '%s' is missing\n", $_)); + return -1; + } + + if ($no_val == 0 && + $href->{$_} ne $resp_hdr{$k}) { + diag(sprintf("response-header failed: expected '%s', got '%s'\n", $href->{$_}, $resp_hdr{$k})); + return -1; + } + } + } + + # we should have sucked up everything + return -1 if (defined $lines); + + return 0; +} + +print "\nStart-Up\n"; +ok(start_proc == 0, "Starting lighttpd") or die(); + +print "\nRequest Line\n"; + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 200 } ); +ok(handle_http == 0, 'Valid HTTP/1.0 Request') or die(); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 400 } ); +ok(handle_http == 0, 'missing Protocol'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 400 } ); +ok(handle_http == 0, 'missing protocol + unknown method'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 400 } ); +ok(handle_http == 0, 'missing protocol + unknown method + missing URI'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 501 } ); +ok(handle_http == 0, 'unknown method'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 505 } ); +ok(handle_http == 0, 'unknown protocol'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 200 } ); +ok(handle_http == 0, 'absolute URI'); + +print "\nLow-Level Request-Header Parsing\n"; +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 200 } ); +ok(handle_http == 0, 'whitespace after key'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 400 } ); +ok(handle_http == 0, 'whitespace with-in key'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 200 } ); +ok(handle_http == 0, 'no whitespace'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 200 } ); +ok(handle_http == 0, 'line-folding'); + +print "\nLow-Level Request-Header Parsing - URI\n"; +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 200 } ); +ok(handle_http == 0, 'URL-encoding'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 404 } ); +ok(handle_http == 0, 'URL-encoding, %00'); + + + +print "\nLow-Level Request-Header Parsing - Host:\n"; + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 200 } ); +ok(handle_http == 0, 'hostname'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 200 } ); +ok(handle_http == 0, 'IPv4 address'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 200 } ); +ok(handle_http == 0, 'IPv6 address'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 200 } ); +ok(handle_http == 0, 'hostname + port'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 200 } ); +ok(handle_http == 0, 'IPv4 address + port'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 200 } ); +ok(handle_http == 0, 'IPv6 address + port'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 400 } ); +ok(handle_http == 0, 'directory traversal'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 400 } ); +ok(handle_http == 0, 'leading and trailing dot'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 200 } ); +ok(handle_http == 0, 'trailing dot is ok'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 400 } ); +ok(handle_http == 0, 'leading dot'); + + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 400 } ); +ok(handle_http == 0, 'two dots'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 400 } ); +ok(handle_http == 0, 'broken port-number'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 400 } ); +ok(handle_http == 0, 'negative port-number'); + + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 400 } ); +ok(handle_http == 0, 'port given but host missing'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 400 } ); +ok(handle_http == 0, 'port and host are broken'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 200 } ); +ok(handle_http == 0, 'allowed characters in host-name'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 400 } ); +ok(handle_http == 0, 'leading dash'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 400 } ); +ok(handle_http == 0, 'dot only'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 400 } ); +ok(handle_http == 0, 'broken IPv4 address - non-digit'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 400 } ); +ok(handle_http == 0, 'broken IPv4 address - too short'); + + + + + +print "\nLow-Level Request-Header Parsing - Content-Length:\n"; +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 400 } ); +ok(handle_http == 0, 'negative Content-Length'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 413 } ); +ok(handle_http == 0, 'Content-Length > max-request-size'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 411 } ); +ok(handle_http == 0, 'Content-Length is empty'); + +print "\nLow-Level Request-Header Parsing - HTTP/1.1\n"; +@request = ( < 'HTTP/1.1', 'HTTP-Status' => 400 } ); +ok(handle_http == 0, 'Host missing'); + +print "\nLow-Level Response-Header Parsing - HTTP/1.1\n"; +@request = ( < 'HTTP/1.1', 'HTTP-Status' => 200, '+Date' => '' } ); +ok(handle_http == 0, 'Date header'); + +@request = ( < 'HTTP/1.1', 'HTTP-Status' => 400, 'Connection' => 'close' } ); +ok(handle_http == 0, 'Host missing'); + + +print "\nLow-Level Response-Header Parsing - Content-Length:\n"; +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 200, 'Content-Length' => '6' } ); +ok(handle_http == 0, 'Content-Length for text/html'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 200, 'Content-Length' => '6' } ); +ok(handle_http == 0, 'Content-Length for text/plain'); + + +print "\nLow-Level Response-Header Parsing - Location:\n"; +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 301, 'Location' => 'http://localhost:2048/dummydir/' } ); +ok(handle_http == 0, 'internal redirect in directory'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 301, 'Location' => 'http://localhost:2048/dummydir/?foo' } ); +ok(handle_http == 0, 'internal redirect in directory + querystring'); + + +print "\nBasic Request-Handling\n"; +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 404 } ); +ok(handle_http == 0, 'file not found'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 404 } ); +ok(handle_http == 0, 'file not found + querystring'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 200, 'HTTP-Content' => '12345'."\n", 'Content-Type' => 'text/plain' } ); +ok(handle_http == 0, 'GET, content == 12345, mimetype text/plain'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 200, 'HTTP-Content' => '12345'."\n", 'Content-Type' => 'text/html' } ); +ok(handle_http == 0, 'GET, content == 12345, mimetype text/html'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 200, 'HTTP-Content' => '12345'."\n", 'Content-Type' => 'application/octet-stream' } ); +ok(handle_http == 0, 'GET, content == 12345, mimetype application/octet-stream'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 411 } ); +ok(handle_http == 0, 'POST request, no Content-Length'); + + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 200 } ); +ok(handle_http == 0, 'POST request, empty request-body'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 200, '-HTTP-Content' => ''} ); +ok(handle_http == 0, 'HEAD request, no content'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 200, '-HTTP-Content' => '', 'Content-Type' => 'text/html', 'Content-Length' => '6'} ); +ok(handle_http == 0, 'HEAD request, mimetype text/html, content-length'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 404, '-HTTP-Content' => '' } ); +ok(handle_http == 0, 'HEAD request, file-not-found, query-string'); + +@request = ( < 'HTTP/1.1', 'HTTP-Status' => 417, '-HTTP-Content' => ''} ); +ok(handle_http == 0, 'Continue, Expect'); + +## ranges + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 206, 'HTTP-Content' => '1234' } ); +ok(handle_http == 0, 'GET, Range 0-3'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 206, 'HTTP-Content' => '45'."\n" } ); +ok(handle_http == 0, 'GET, Range -3'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 206, 'HTTP-Content' => '45'."\n" } ); +ok(handle_http == 0, 'GET, Range 3-'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 206, 'HTTP-Content' => < 'HTTP/1.0', 'HTTP-Status' => 200 } ); +ok(handle_http == 0, 'GET, Range 0--'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 200 } ); +ok(handle_http == 0, 'GET, Range -2-3'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 416, 'HTTP-Content' => < + + + + 416 - Requested Range Not Satisfiable + + +

416 - Requested Range Not Satisfiable

+ + +EOF + } ); +ok(handle_http == 0, 'GET, Range -0'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 416, 'HTTP-Content' => < + + + + 416 - Requested Range Not Satisfiable + + +

416 - Requested Range Not Satisfiable

+ + +EOF + } ); + +ok(handle_http == 0, 'GET, Range start out of range'); + + + + + + + + + + + +print "\nmodules - mod_access\n"; + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 403 } ); +ok(handle_http == 0, 'forbid access to ...~'); + + +print "\nmodules - mod_auth\n"; + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 401 } ); +ok(handle_http == 0, 'Missing Auth-token'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 401 } ); +ok(handle_http == 0, 'Basic-Auth: Wrong Auth-token'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 200 } ); +ok(handle_http == 0, 'Basic-Auth: Valid Auth-token'); + +# mod-cgi +# +print "\nmodules - mod_cgi\n"; +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 200 } ); +ok(handle_http == 0, 'perl via cgi'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 200, 'HTTP-Content' => '/cgi.pl' } ); +ok(handle_http == 0, 'perl via cgi + pathinfo'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 200, 'HTTP-Content' => '/foo' } ); +ok(handle_http == 0, 'perl via cgi + pathinfo'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 200 } ); +ok(handle_http == 0, 'NPH + perl, Bug #14'); + + +print "\nmodules - mod_fastcgi\n"; + +SKIP: { + skip "no PHP running on port 1026", 11 if pidof("php") == -1; + + @request = ( < 'HTTP/1.0', 'HTTP-Status' => 200 } ); + ok(handle_http == 0, 'valid request'); + + @request = ( < 'HTTP/1.0', 'HTTP-Status' => 404 } ); + ok(handle_http == 0, 'file not found'); + + @request = ( < 'HTTP/1.0', 'HTTP-Status' => 200 } ); + ok(handle_http == 0, 'index-file handling'); + + @request = ( < 'HTTP/1.0', 'HTTP-Status' => 302, 'Location' => 'http://www.example.org:2048/' } ); + ok(handle_http == 0, 'Status + Location via FastCGI'); + + @request = ( < 'HTTP/1.0', 'HTTP-Status' => 200 } ); + ok(handle_http == 0, '$_SERVER["PHP_SELF"]'); + + @request = ( < 'HTTP/1.0', 'HTTP-Status' => 200, 'HTTP-Content' => '/phpself.php' } ); + ok(handle_http == 0, '$_SERVER["PHP_SELF"]'); + + @request = ( < 'HTTP/1.0', 'HTTP-Status' => 200, 'HTTP-Content' => 'www.example.org' } ); + ok(handle_http == 0, 'SERVER_NAME'); + + @request = ( < 'HTTP/1.0', 'HTTP-Status' => 200, 'HTTP-Content' => 'www.example.org' } ); + ok(handle_http == 0, 'SERVER_NAME'); + + @request = ( < 'HTTP/1.0', 'HTTP-Status' => 200, 'HTTP-Content' => 'www.example.org' } ); + ok(handle_http == 0, 'SERVER_NAME'); + + @request = ( < 'HTTP/1.0', 'HTTP-Status' => 200, 'HTTP-Content' => 'zzz.example.org' } ); + ok(handle_http == 0, 'SERVER_NAME'); + + @request = ( < 'HTTP/1.0', 'HTTP-Status' => 200 } ); + ok(handle_http == 0, 'PATHINFO'); + + @request = ( < 'HTTP/1.0', 'HTTP-Status' => 404 } ); + ok(handle_http == 0, 'PATHINFO on a directory'); + + @request = ( < 'HTTP/1.0', 'HTTP-Status' => 200, 'HTTP-Content' => '/indexfile/index.php' } ); + ok(handle_http == 0, 'PHP_SELF + Indexfile, Bug #3'); + + +} + + +print "\nmodules - mod_redirect\n"; +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 301, 'Location' => 'http://localhost:2048/' } ); +ok(handle_http == 0, 'external redirect'); + + +print "\nmodules - mod_userdir\n"; + +# get current user + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 404 } ); +ok(handle_http == 0, 'valid user'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 301, 'Location' => 'http://localhost:2048/~jan/' } ); +ok(handle_http == 0, 'valid user + redirect'); + +@request = ( < 'HTTP/1.0', 'HTTP-Status' => 301, 'Location' => 'http://www.example.org/~jan/' } ); +ok(handle_http == 0, 'valid user + redirect'); + + + + + + +print "\nclean up\n"; + +ok(stop_proc == 0, "Stopping lighttpd"); + +