123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489 |
- #!/usr/bin/env perl
- BEGIN {
- # add current source dir to the include-path
- # we need this for make distcheck
- (my $srcdir = $0) =~ s,/[^/]+$,/,;
- unshift @INC, $srcdir;
- }
- use strict;
- use IO::Socket;
- use Test::More tests => 52;
- use LightyTest;
- my $tf = LightyTest->new();
- my $t;
- ok($tf->start_proc == 0, "Starting lighttpd") or die();
- ## Basic Request-Handling
- $t->{REQUEST} = ( <<EOF
- GET /foobar HTTP/1.0
- EOF
- );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 404 } ];
- ok($tf->handle_http($t) == 0, 'file not found');
- $t->{REQUEST} = ( <<EOF
- GET /foobar?foobar HTTP/1.0
- EOF
- );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 404 } ];
- ok($tf->handle_http($t) == 0, 'file not found + querystring');
- $t->{REQUEST} = ( <<EOF
- GET /12345.txt HTTP/1.0
- Host: 123.example.org
- EOF
- );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200, 'HTTP-Content' => '12345'."\n", 'Content-Type' => 'text/plain' } ];
- ok($tf->handle_http($t) == 0, 'GET, content == 12345, mimetype text/plain');
- $t->{REQUEST} = ( <<EOF
- GET /12345.html HTTP/1.0
- Host: 123.example.org
- EOF
- );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200, 'HTTP-Content' => '12345'."\n", 'Content-Type' => 'text/html' } ];
- ok($tf->handle_http($t) == 0, 'GET, content == 12345, mimetype text/html');
- $t->{REQUEST} = ( <<EOF
- GET /dummyfile.bla HTTP/1.0
- Host: 123.example.org
- EOF
- );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200, 'HTTP-Content' => '12345'."\n", 'Content-Type' => 'application/octet-stream' } ];
- ok($tf->handle_http($t) == 0, 'GET, content == 12345, mimetype application/octet-stream');
- $t->{REQUEST} = ( <<EOF
- POST / HTTP/1.0
- EOF
- );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 411 } ];
- ok($tf->handle_http($t) == 0, 'POST request, no Content-Length');
- $t->{REQUEST} = ( <<EOF
- POST / HTTP/1.0
- Content-type: application/x-www-form-urlencoded
- Content-length: 0
- EOF
- );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200 } ];
- ok($tf->handle_http($t) == 0, 'POST request, empty request-body');
- $t->{REQUEST} = ( <<EOF
- HEAD / HTTP/1.0
- EOF
- );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200, '-HTTP-Content' => ''} ];
- ok($tf->handle_http($t) == 0, 'HEAD request, no content');
- $t->{REQUEST} = ( <<EOF
- HEAD /12345.html HTTP/1.0
- Host: 123.example.org
- EOF
- );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200, '-HTTP-Content' => '', 'Content-Type' => 'text/html', 'Content-Length' => '6'} ];
- ok($tf->handle_http($t) == 0, 'HEAD request, mimetype text/html, content-length');
- $t->{REQUEST} = ( <<EOF
- HEAD http://123.example.org/12345.html HTTP/1.1
- Connection: close
- EOF
- );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.1', 'HTTP-Status' => 200, '-HTTP-Content' => '', 'Content-Type' => 'text/html', 'Content-Length' => '6'} ];
- ok($tf->handle_http($t) == 0, 'Hostname in first line, HTTP/1.1');
- $t->{REQUEST} = ( <<EOF
- HEAD https://123.example.org/12345.html HTTP/1.0
- EOF
- );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200, '-HTTP-Content' => '', 'Content-Type' => 'text/html', 'Content-Length' => '6'} ];
- ok($tf->handle_http($t) == 0, 'Hostname in first line as https url');
- $t->{REQUEST} = ( <<EOF
- HEAD /foobar?foobar HTTP/1.0
- EOF
- );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 404, '-HTTP-Content' => '' } ];
- ok($tf->handle_http($t) == 0, 'HEAD request, file-not-found, query-string');
- $t->{REQUEST} = ( <<EOF
- GET / HTTP/1.1
- Connection: close
- Expect: 100-continue
- EOF
- );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.1', 'HTTP-Status' => 417 } ];
- ok($tf->handle_http($t) == 0, 'Continue, Expect');
- ## ranges
- $t->{REQUEST} = ( <<EOF
- GET /12345.txt HTTP/1.0
- Host: 123.example.org
- Range: bytes=0-3
- EOF
- );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 206, 'HTTP-Content' => '1234' } ];
- ok($tf->handle_http($t) == 0, 'GET, Range 0-3');
- $t->{REQUEST} = ( <<EOF
- GET /12345.txt HTTP/1.0
- Host: 123.example.org
- Range: bytes=-3
- EOF
- );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 206, 'HTTP-Content' => '45'."\n" } ];
- ok($tf->handle_http($t) == 0, 'GET, Range -3');
- $t->{REQUEST} = ( <<EOF
- GET /12345.txt HTTP/1.0
- Host: 123.example.org
- Range: bytes=3-
- EOF
- );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 206, 'HTTP-Content' => '45'."\n" } ];
- ok($tf->handle_http($t) == 0, 'GET, Range 3-');
- $t->{REQUEST} = ( <<EOF
- GET /12345.txt HTTP/1.0
- Host: 123.example.org
- Range: bytes=0-1,3-4
- EOF
- );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 206, 'HTTP-Content' => <<EOF
- \r
- --fkj49sn38dcn3\r
- Content-Range: bytes 0-1/6\r
- Content-Type: text/plain\r
- \r
- 12\r
- --fkj49sn38dcn3\r
- Content-Range: bytes 3-4/6\r
- Content-Type: text/plain\r
- \r
- 45\r
- --fkj49sn38dcn3--\r
- EOF
- } ];
- ok($tf->handle_http($t) == 0, 'GET, Range 0-1,3-4');
- $t->{REQUEST} = ( <<EOF
- GET /12345.txt HTTP/1.0
- Host: 123.example.org
- Range: bytes=0--
- EOF
- );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200 } ];
- ok($tf->handle_http($t) == 0, 'GET, Range 0--');
- $t->{REQUEST} = ( <<EOF
- GET /12345.txt HTTP/1.0
- Host: 123.example.org
- Range: bytes=-2-3
- EOF
- );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200 } ];
- ok($tf->handle_http($t) == 0, 'GET, Range -2-3');
- $t->{REQUEST} = ( <<EOF
- GET /12345.txt HTTP/1.0
- Host: 123.example.org
- Range: bytes=-0
- EOF
- );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 416, 'HTTP-Content' => <<EOF
- <?xml version="1.0" encoding="iso-8859-1"?>
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
- <head>
- <title>416 - Requested Range Not Satisfiable</title>
- </head>
- <body>
- <h1>416 - Requested Range Not Satisfiable</h1>
- </body>
- </html>
- EOF
- } ];
- ok($tf->handle_http($t) == 0, 'GET, Range -0');
- $t->{REQUEST} = ( <<EOF
- GET /12345.txt HTTP/1.0
- Host: 123.example.org
- Range: bytes=25-
- EOF
- );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 416, 'HTTP-Content' => <<EOF
- <?xml version="1.0" encoding="iso-8859-1"?>
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
- <head>
- <title>416 - Requested Range Not Satisfiable</title>
- </head>
- <body>
- <h1>416 - Requested Range Not Satisfiable</h1>
- </body>
- </html>
- EOF
- } ];
- ok($tf->handle_http($t) == 0, 'GET, Range start out of range');
- $t->{REQUEST} = ( <<EOF
- GET / HTTP/1.0
- Hsgfsdjf: asdfhdf
- hdhd: shdfhfdasd
- hfhr: jfghsdfg
- jfuuehdmn: sfdgjfdg
- jvcbzufdg: sgfdfg
- hrnvcnd: jfjdfg
- jfusfdngmd: gfjgfdusdfg
- nfj: jgfdjdfg
- jfue: jfdfdg
- EOF
- );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200 } ];
- ok($tf->handle_http($t) == 0, 'larger headers');
- $t->{REQUEST} = ( <<EOF
- GET / HTTP/1.0
- Host: www.example.org
- Host: 123.example.org
- EOF
- );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 400 } ];
- ok($tf->handle_http($t) == 0, 'Duplicate Host headers, Bug #25');
- $t->{REQUEST} = ( <<EOF
- GET / HTTP/1.0
- Content-Length: 5
- Content-Length: 4
- EOF
- );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 400 } ];
- ok($tf->handle_http($t) == 0, 'Duplicate Content-Length headers');
- $t->{REQUEST} = ( <<EOF
- GET / HTTP/1.0
- Content-Type: 5
- Content-Type: 4
- EOF
- );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 400 } ];
- ok($tf->handle_http($t) == 0, 'Duplicate Content-Type headers');
- $t->{REQUEST} = ( <<EOF
- GET / HTTP/1.0
- Range: bytes=5-6
- Range: bytes=5-9
- EOF
- );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 400 } ];
- ok($tf->handle_http($t) == 0, 'Duplicate Range headers');
- $t->{REQUEST} = ( <<EOF
- GET / HTTP/1.0
- If-None-Match: 5
- If-None-Match: 4
- EOF
- );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200 } ];
- ok($tf->handle_http($t) == 0, 'Duplicate If-None-Match headers');
- $t->{REQUEST} = ( <<EOF
- GET / HTTP/1.0
- If-Modified-Since: 5
- If-Modified-Since: 4
- EOF
- );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 400 } ];
- ok($tf->handle_http($t) == 0, 'Duplicate If-Modified-Since headers');
- $t->{REQUEST} = ( <<EOF
- GET /range.pdf HTTP/1.0
- Range: bytes=0-
- EOF
- );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200 } ];
- ok($tf->handle_http($t) == 0, 'GET, Range with range-requests-disabled');
- $t->{REQUEST} = ( <<EOF
- GET / HTTP/1.0
- Content-Length: 4
- 1234
- EOF
- );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 400 } ];
- ok($tf->handle_http($t) == 0, 'GET with Content-Length');
- $t->{REQUEST} = ( <<EOF
- OPTIONS / HTTP/1.0
- Content-Length: 4
- 1234
- EOF
- );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200 } ];
- ok($tf->handle_http($t) == 0, 'OPTIONS with Content-Length');
- $t->{REQUEST} = ( <<EOF
- OPTIONS rtsp://221.192.134.146:80 RTSP/1.1
- Host: 221.192.134.146:80
- EOF
- );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 400 } ];
- ok($tf->handle_http($t) == 0, 'OPTIONS for RTSP');
- $t->{REQUEST} = ( <<EOF
- HEAD / HTTP/1.0
- Content-Length: 4
- 1234
- EOF
- );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 400 } ];
- ok($tf->handle_http($t) == 0, 'HEAD with Content-Length');
- $t->{REQUEST} = ( <<EOF
- GET /index.html HTTP/1.0
- If-Modified-Since: Sun, 01 Jan 2036 00:00:02 GMT
- If-Modified-Since: Sun, 01 Jan 2036 00:00:02 GMT
- EOF
- );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 304 } ];
- ok($tf->handle_http($t) == 0, 'Duplicate If-Mod-Since, with equal timestamps');
- $t->{REQUEST} = ( "GET / HTTP/1.0\r\nIf-Modified-Since: \0\r\n\r\n" );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 400 } ];
- ok($tf->handle_http($t) == 0, 'invalid chars in Header values (bug #1286)');
- $t->{REQUEST} = ( "GET / HTTP/1.0\r\nIf-Modified-Since: \r\n\r\n" );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200 } ];
- ok($tf->handle_http($t) == 0, 'empty If-Modified-Since');
- $t->{REQUEST} = ( "GET / HTTP/1.0\r\nIf-Modified-Since: foobar\r\n\r\n" );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200 } ];
- ok($tf->handle_http($t) == 0, 'broken If-Modified-Since');
- $t->{REQUEST} = ( "GET / HTTP/1.0\r\nIf-Modified-Since: this string is too long to be a valid timestamp\r\n\r\n" );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200 } ];
- ok($tf->handle_http($t) == 0, 'broken If-Modified-Since');
- $t->{REQUEST} = ( <<EOF
- GET /index.html HTTP/1.0
- If-Modified-Since2: Sun, 01 Jan 2036 00:00:03 GMT
- If-Modified-Since: Sun, 01 Jan 2036 00:00:02 GMT
- EOF
- );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 304 } ];
- ok($tf->handle_http($t) == 0, 'Similar Headers (bug #1287)');
- $t->{REQUEST} = ( <<EOF
- GET /index.html HTTP/1.0
- If-Modified-Since: Sun, 01 Jan 2036 00:00:02 GMT
- EOF
- );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 304, 'Content-Type' => 'text/html' } ];
- ok($tf->handle_http($t) == 0, 'If-Modified-Since');
- $t->{REQUEST} = ( <<EOF
- GET /index.html HTTP/1.0
- If-Modified-Since: Sun, 01 Jan 2036 00:00:02 GMT
- EOF
- );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 304, '-Content-Length' => '' } ];
- ok($tf->handle_http($t) == 0, 'Status 304 has no Content-Length (#1002)');
- $t->{REQUEST} = ( <<EOF
- GET /12345.txt HTTP/1.0
- Host: 123.example.org
- EOF
- );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200, 'HTTP-Content' => '12345'."\n", 'Content-Type' => 'text/plain' } ];
- $t->{SLOWREQUEST} = 1;
- ok($tf->handle_http($t) == 0, 'GET, slow \\r\\n\\r\\n (#2105)');
- print "\nPathinfo for static files\n";
- $t->{REQUEST} = ( <<EOF
- GET /image.jpg/index.php HTTP/1.0
- EOF
- );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200, 'Content-Type' => 'image/jpeg' } ];
- ok($tf->handle_http($t) == 0, 'static file accepting pathinfo by default');
- $t->{REQUEST} = ( <<EOF
- GET /image.jpg/index.php HTTP/1.0
- Host: zzz.example.org
- EOF
- );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 403 } ];
- ok($tf->handle_http($t) == 0, 'static file with forbidden pathinfo');
- print "\nConnection header\n";
- $t->{REQUEST} = ( <<EOF
- GET /12345.txt HTTP/1.1
- Connection : close
- Host: 123.example.org
- EOF
- );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.1', 'HTTP-Status' => 200, 'HTTP-Content' => '12345'."\n", 'Content-Type' => 'text/plain', 'Connection' => 'close' } ];
- ok($tf->handle_http($t) == 0, 'Connection-header, spaces before ":"');
- $t->{REQUEST} = ( <<EOF
- GET /12345.txt HTTP/1.1
- Connection: ,close
- Host: 123.example.org
- EOF
- );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.1', 'HTTP-Status' => 200, 'HTTP-Content' => '12345'."\n", 'Content-Type' => 'text/plain', 'Connection' => 'close' } ];
- ok($tf->handle_http($t) == 0, 'Connection-header, leading comma');
- $t->{REQUEST} = ( <<EOF
- GET /12345.txt HTTP/1.1
- Connection: close,,TE
- Host: 123.example.org
- EOF
- );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.1', 'HTTP-Status' => 200, 'HTTP-Content' => '12345'."\n", 'Content-Type' => 'text/plain', 'Connection' => 'close' } ];
- ok($tf->handle_http($t) == 0, 'Connection-header, no value between two commas');
- $t->{REQUEST} = ( <<EOF
- GET /12345.txt HTTP/1.1
- Connection: close, ,TE
- Host: 123.example.org
- EOF
- );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.1', 'HTTP-Status' => 200, 'HTTP-Content' => '12345'."\n", 'Content-Type' => 'text/plain', 'Connection' => 'close' } ];
- ok($tf->handle_http($t) == 0, 'Connection-header, space between two commas');
- $t->{REQUEST} = ( <<EOF
- GET /12345.txt HTTP/1.1
- Connection: close,
- Host: 123.example.org
- EOF
- );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.1', 'HTTP-Status' => 200, 'HTTP-Content' => '12345'."\n", 'Content-Type' => 'text/plain', 'Connection' => 'close' } ];
- ok($tf->handle_http($t) == 0, 'Connection-header, comma after value');
- $t->{REQUEST} = ( <<EOF
- GET /12345.txt HTTP/1.1
- Connection: close,
- Host: 123.example.org
- EOF
- );
- $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.1', 'HTTP-Status' => 200, 'HTTP-Content' => '12345'."\n", 'Content-Type' => 'text/plain', 'Connection' => 'close' } ];
- ok($tf->handle_http($t) == 0, 'Connection-header, comma and space after value');
- ok($tf->stop_proc == 0, "Stopping lighttpd");
|