Annotation of embedaddon/lighttpd/tests/core-request.t, revision 1.1

1.1     ! misho       1: #!/usr/bin/env perl
        !             2: BEGIN {
        !             3:        # add current source dir to the include-path
        !             4:        # we need this for make distcheck
        !             5:        (my $srcdir = $0) =~ s,/[^/]+$,/,;
        !             6:        unshift @INC, $srcdir;
        !             7: }
        !             8: 
        !             9: use strict;
        !            10: use IO::Socket;
        !            11: use Test::More tests => 36;
        !            12: use LightyTest;
        !            13: 
        !            14: my $tf = LightyTest->new();
        !            15: my $t;
        !            16: 
        !            17: ok($tf->start_proc == 0, "Starting lighttpd") or die();
        !            18: 
        !            19: ## Low-Level Request-Header Parsing - URI
        !            20: 
        !            21: $t->{REQUEST}  = ( <<EOF
        !            22: GET /index%2ehtml HTTP/1.0
        !            23: EOF
        !            24:  );
        !            25: $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200 } ];
        !            26: ok($tf->handle_http($t) == 0, 'URL-encoding');
        !            27: 
        !            28: $t->{REQUEST}  = ( <<EOF
        !            29: GET /index.html%00 HTTP/1.0
        !            30: EOF
        !            31:  );
        !            32: $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 404 } ];
        !            33: ok($tf->handle_http($t) == 0, 'URL-encoding, %00');
        !            34: 
        !            35: 
        !            36: 
        !            37: ## Low-Level Request-Header Parsing - Host
        !            38: 
        !            39: $t->{REQUEST}  = ( <<EOF
        !            40: GET / HTTP/1.0
        !            41: Host: www.example.org
        !            42: EOF
        !            43:  );
        !            44: $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200 } ];
        !            45: ok($tf->handle_http($t) == 0, 'hostname');
        !            46: 
        !            47: $t->{REQUEST}  = ( <<EOF
        !            48: GET / HTTP/1.0
        !            49: Host: 127.0.0.1
        !            50: EOF
        !            51:  );
        !            52: $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200 } ];
        !            53: ok($tf->handle_http($t) == 0, 'IPv4 address');
        !            54: 
        !            55: $t->{REQUEST}  = ( <<EOF
        !            56: GET / HTTP/1.0
        !            57: Host: [::1]
        !            58: EOF
        !            59:  );
        !            60: $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200 } ];
        !            61: ok($tf->handle_http($t) == 0, 'IPv6 address');
        !            62: 
        !            63: $t->{REQUEST}  = ( <<EOF
        !            64: GET / HTTP/1.0
        !            65: Host: www.example.org:80
        !            66: EOF
        !            67:  );
        !            68: $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200 } ];
        !            69: ok($tf->handle_http($t) == 0, 'hostname + port');
        !            70: 
        !            71: $t->{REQUEST}  = ( <<EOF
        !            72: GET / HTTP/1.0
        !            73: Host: 127.0.0.1:80
        !            74: EOF
        !            75:  );
        !            76: $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200 } ];
        !            77: ok($tf->handle_http($t) == 0, 'IPv4 address + port');
        !            78: 
        !            79: $t->{REQUEST}  = ( <<EOF
        !            80: GET / HTTP/1.0
        !            81: Host: [::1]:80
        !            82: EOF
        !            83:  );
        !            84: $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200 } ];
        !            85: ok($tf->handle_http($t) == 0, 'IPv6 address + port');
        !            86: 
        !            87: $t->{REQUEST}  = ( <<EOF
        !            88: GET / HTTP/1.0
        !            89: Host: ../123.org
        !            90: EOF
        !            91:  );
        !            92: $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 400 } ];
        !            93: ok($tf->handle_http($t) == 0, 'directory traversal');
        !            94: 
        !            95: $t->{REQUEST}  = ( <<EOF
        !            96: GET / HTTP/1.0
        !            97: Host: .jsdh.sfdg.sdfg.
        !            98: EOF
        !            99:  );
        !           100: $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 400 } ];
        !           101: ok($tf->handle_http($t) == 0, 'leading and trailing dot');
        !           102: 
        !           103: $t->{REQUEST}  = ( <<EOF
        !           104: GET / HTTP/1.0
        !           105: Host: jsdh.sfdg.sdfg.
        !           106: EOF
        !           107:  );
        !           108: $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200 } ];
        !           109: ok($tf->handle_http($t) == 0, 'trailing dot is ok');
        !           110: 
        !           111: $t->{REQUEST}  = ( <<EOF
        !           112: GET / HTTP/1.0
        !           113: Host: .jsdh.sfdg.sdfg
        !           114: EOF
        !           115:  );
        !           116: $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 400 } ];
        !           117: ok($tf->handle_http($t) == 0, 'leading dot');
        !           118: 
        !           119: 
        !           120: $t->{REQUEST}  = ( <<EOF
        !           121: GET / HTTP/1.0
        !           122: Host: jsdh..sfdg.sdfg
        !           123: EOF
        !           124:  );
        !           125: $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 400 } ];
        !           126: ok($tf->handle_http($t) == 0, 'two dots');
        !           127: 
        !           128: $t->{REQUEST}  = ( <<EOF
        !           129: GET / HTTP/1.0
        !           130: Host: jsdh.sfdg.sdfg:asd
        !           131: EOF
        !           132:  );
        !           133: $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 400 } ];
        !           134: ok($tf->handle_http($t) == 0, 'broken port-number');
        !           135: 
        !           136: $t->{REQUEST}  = ( <<EOF
        !           137: GET / HTTP/1.0
        !           138: Host: jsdh.sfdg.sdfg:-1
        !           139: EOF
        !           140:  );
        !           141: $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 400 } ];
        !           142: ok($tf->handle_http($t) == 0, 'negative port-number');
        !           143: 
        !           144: 
        !           145: $t->{REQUEST}  = ( <<EOF
        !           146: GET / HTTP/1.0
        !           147: Host: :80
        !           148: EOF
        !           149:  );
        !           150: $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 400 } ];
        !           151: ok($tf->handle_http($t) == 0, 'port given but host missing');
        !           152: 
        !           153: $t->{REQUEST}  = ( <<EOF
        !           154: GET / HTTP/1.0
        !           155: Host: .jsdh.sfdg.:sdfg.
        !           156: EOF
        !           157:  );
        !           158: $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 400 } ];
        !           159: ok($tf->handle_http($t) == 0, 'port and host are broken');
        !           160: 
        !           161: $t->{REQUEST}  = ( <<EOF
        !           162: GET / HTTP/1.0
        !           163: Host: a.b-c.d123
        !           164: EOF
        !           165:  );
        !           166: $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200 } ];
        !           167: ok($tf->handle_http($t) == 0, 'allowed characters in host-name');
        !           168: 
        !           169: $t->{REQUEST}  = ( <<EOF
        !           170: GET / HTTP/1.0
        !           171: Host: -a.c
        !           172: EOF
        !           173:  );
        !           174: $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 400 } ];
        !           175: ok($tf->handle_http($t) == 0, 'leading dash');
        !           176: 
        !           177: $t->{REQUEST}  = ( <<EOF
        !           178: GET / HTTP/1.0
        !           179: Host: .
        !           180: EOF
        !           181:  );
        !           182: $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 400 } ];
        !           183: ok($tf->handle_http($t) == 0, 'dot only');
        !           184: 
        !           185: $t->{REQUEST}  = ( <<EOF
        !           186: GET / HTTP/1.0
        !           187: Host: a192.168.2.10:1234
        !           188: EOF
        !           189:  );
        !           190: $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 400 } ];
        !           191: ok($tf->handle_http($t) == 0, 'broken IPv4 address - non-digit');
        !           192: 
        !           193: $t->{REQUEST}  = ( <<EOF
        !           194: GET / HTTP/1.0
        !           195: Host: 192.168.2:1234
        !           196: EOF
        !           197:  );
        !           198: $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 400 } ];
        !           199: ok($tf->handle_http($t) == 0, 'broken IPv4 address - too short');
        !           200: 
        !           201: 
        !           202: 
        !           203: ## Low-Level Request-Header Parsing - Content-Length
        !           204: 
        !           205: 
        !           206: $t->{REQUEST}  = ( <<EOF
        !           207: GET /index.html HTTP/1.0
        !           208: Content-Length: -2
        !           209: EOF
        !           210:  );
        !           211: $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 400 } ];
        !           212: ok($tf->handle_http($t) == 0, 'negative Content-Length');
        !           213: 
        !           214: $t->{REQUEST}  = ( <<EOF
        !           215: POST /12345.txt HTTP/1.0
        !           216: Host: 123.example.org
        !           217: Content-Length: 2147483648
        !           218: EOF
        !           219:  );
        !           220: $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 413 } ];
        !           221: ok($tf->handle_http($t) == 0, 'Content-Length > max-request-size');
        !           222: 
        !           223: $t->{REQUEST}  = ( <<EOF
        !           224: POST /12345.txt HTTP/1.0
        !           225: Host: 123.example.org
        !           226: Content-Length:
        !           227: EOF
        !           228:  );
        !           229: $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 411 } ];
        !           230: ok($tf->handle_http($t) == 0, 'Content-Length is empty');
        !           231: 
        !           232: print "\nLow-Level Request-Header Parsing - HTTP/1.1\n";
        !           233: $t->{REQUEST}  = ( <<EOF
        !           234: GET / HTTP/1.1
        !           235: EOF
        !           236:  );
        !           237: $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.1', 'HTTP-Status' => 400 } ];
        !           238: ok($tf->handle_http($t) == 0, 'Host missing');
        !           239: 
        !           240: print "\nContent-Type\n";
        !           241: $t->{REQUEST}  = ( <<EOF
        !           242: GET /image.jpg HTTP/1.0
        !           243: EOF
        !           244:  );
        !           245: $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200, 'Content-Type' => 'image/jpeg' } ];
        !           246: ok($tf->handle_http($t) == 0, 'Content-Type - image/jpeg');
        !           247: 
        !           248: $t->{REQUEST}  = ( <<EOF
        !           249: GET /image.JPG HTTP/1.0
        !           250: EOF
        !           251:  );
        !           252: $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200, 'Content-Type' => 'image/jpeg' } ];
        !           253: ok($tf->handle_http($t) == 0, 'Content-Type - image/jpeg (upper case)');
        !           254: 
        !           255: $t->{REQUEST}  = ( <<EOF
        !           256: GET /a HTTP/1.0
        !           257: EOF
        !           258:  );
        !           259: $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200, 'Content-Type' => 'application/octet-stream' } ];
        !           260: ok($tf->handle_http($t) == 0, 'Content-Type - unknown');
        !           261: 
        !           262: $t->{REQUEST}  = ( <<EOF
        !           263: GET  HTTP/1.0
        !           264: EOF
        !           265:  );
        !           266: $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 400 } ];
        !           267: ok($tf->handle_http($t) == 0, 'empty request-URI');
        !           268: 
        !           269: $t->{REQUEST}  = ( <<EOF
        !           270: GET /Foo.txt HTTP/1.0
        !           271: EOF
        !           272:  );
        !           273: $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200 } ];
        !           274: ok($tf->handle_http($t) == 0, 'uppercase filenames');
        !           275: 
        !           276: $t->{REQUEST}  = ( <<EOF
        !           277: GET / HTTP/1.0
        !           278: Location: foo
        !           279: Location: foobar
        !           280:   baz
        !           281: EOF
        !           282:  );
        !           283: $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200 } ];
        !           284: ok($tf->handle_http($t) == 0, '#1232 - duplicate headers with line-wrapping');
        !           285: 
        !           286: $t->{REQUEST}  = ( <<EOF
        !           287: GET / HTTP/1.0
        !           288: Location: 
        !           289: Location: foobar
        !           290:   baz
        !           291: EOF
        !           292:  );
        !           293: $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200 } ];
        !           294: ok($tf->handle_http($t) == 0, '#1232 - duplicate headers with line-wrapping - test 2');
        !           295: 
        !           296: $t->{REQUEST}  = ( <<EOF
        !           297: GET / HTTP/1.0
        !           298: A: 
        !           299: Location: foobar
        !           300:   baz
        !           301: EOF
        !           302:  );
        !           303: $t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 200 } ];
        !           304: ok($tf->handle_http($t) == 0, '#1232 - duplicate headers with line-wrapping - test 3');
        !           305: 
        !           306: 
        !           307: 
        !           308: 
        !           309: ok($tf->stop_proc == 0, "Stopping lighttpd");
        !           310: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>