1#!perl -w 2use strict; 3use Test::More; 4use HTTP::Parser::XS qw(:all); 5 6plan skip_all => 'PP has no static limitations' 7 if $HTTP::Parser::XS::BACKEND eq 'pp'; 8 9my $MAX_HEADER_LEN = 1024; 10my $MAX_HEADERS = 128; 11 12my $crlf = "\015\012"; 13 14note 'request parser'; 15# on success 16my $name = 'x' x $MAX_HEADER_LEN; # OK 17my $request = "GET / HTTP/1.1" . $crlf 18 . "$name: 42" . $crlf 19 . $crlf; 20 21my $env = {}; 22my $ret = parse_http_request($request, $env); 23cmp_ok $ret, '>', 0, 'parsing status (success)'; 24is $env->{REQUEST_METHOD}, 'GET'; 25is $env->{'HTTP_' . uc $name}, 42, 'very long name'; 26 27# on fail 28$name = 'x' x ($MAX_HEADER_LEN + 1); 29$request = "GET / HTTP/1.1" . $crlf 30 . "$name: 42" . $crlf 31 . $crlf; 32 33$env = {}; 34$ret = parse_http_request($request, $env); 35cmp_ok $ret, '==', -1, 'parsing status (fail)'; 36is $env->{REQUEST_METHOD}, undef; 37is $env->{'HTTP_' . uc $name}, undef, 'too long name'; 38 39# too many headers 40 41$request = "GET / HTTP/1.1" . $crlf 42 . join($crlf, map { "X$_: $_" } 0 .. $MAX_HEADERS) . $crlf 43 . $crlf; 44 45$env = {}; 46$ret = parse_http_request($request, $env); 47is $ret, -1, 'too many headers'; 48 49note 'response parser'; 50# on success 51$name = 'x' x $MAX_HEADER_LEN; 52my $response = 'HTTP/1.1 200 OK' . $crlf 53 . "$name: 42" . $crlf 54 . $crlf; 55($ret, my $minor_version, my $status, my $message, my $headers) 56 = parse_http_response($response, HEADERS_AS_HASHREF); 57 58cmp_ok $ret, '>', 0, 'parsing status (success)'; 59is $minor_version, 1; 60is $status, 200; 61is $message, 'OK'; 62is $headers->{$name}, 42, 'very long name'; 63 64# on fail 65$name = 'x' x ($MAX_HEADER_LEN + 1); 66$response = 'HTTP/1.1 200 OK' . $crlf 67 . "$name: 42" . $crlf 68 . "foo: bar" . $crlf 69 . $crlf; 70($ret, $minor_version, $status, $message, $headers) 71 = parse_http_response($response, HEADERS_AS_HASHREF); 72 73cmp_ok $ret, '>', -1, 'parsing status (fail)'; 74is_deeply $headers, { foo => 'bar' }, 'too long name is ignored' 75 or diag(explain($headers)); 76 77# too many headers 78$response = 'HTTP/1.1 200 OK' . $crlf 79 . join($crlf, map { "X$_: $_" } 0 .. $MAX_HEADERS) . $crlf 80 . "foo: bar" . $crlf 81 . $crlf; 82($ret) = parse_http_response($response, HEADERS_AS_HASHREF); 83is $ret, -1, 'too many headers (fail)'; 84 85 86done_testing; 87 88