Annotation of embedaddon/lighttpd/tests/core-request.t, revision 1.1.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>