use strict; use Test::More; use Plack::HTTPParser::PP; *parse_http_request = \&Plack::HTTPParser::PP::parse_http_request; my $req; my %env; $req = "GET /abc?x=y HTTP/1.0\r\n\r\n"; %env = (); is(parse_http_request($req, \%env), length($req), 'simple get'); is_deeply(\%env, { PATH_INFO => '/abc', QUERY_STRING => 'x=y', REQUEST_METHOD => "GET", SCRIPT_NAME => '', SERVER_PROTOCOL => 'HTTP/1.0', REQUEST_URI => '/abc?x=y', }, 'result of GET /'); $req = <<"EOT"; POST /hoge HTTP/1.1\r Content-Type: text/plain\r Content-Length: 15\r Host: example.com\r User-Agent: hoge\r \r EOT %env = (); is(parse_http_request($req, \%env), length($req), 'POST'); is_deeply(\%env, { CONTENT_LENGTH => 15, CONTENT_TYPE => 'text/plain', HTTP_HOST => 'example.com', HTTP_USER_AGENT => 'hoge', PATH_INFO => '/hoge', REQUEST_METHOD => "POST", REQUEST_URI => '/hoge', QUERY_STRING => '', SERVER_PROTOCOL => 'HTTP/1.1', SCRIPT_NAME => '', }, 'result of GET with headers'); $req = <<"EOT"; GET / HTTP/1.0\r Foo: \r Foo: \r abc\r de\r Foo: fgh\r \r EOT %env = (); is(parse_http_request($req, \%env), length($req), 'multiline header'); is_deeply(\%env, { HTTP_FOO => ', abc de, fgh', PATH_INFO => '/', QUERY_STRING => '', REQUEST_METHOD => 'GET', REQUEST_URI => '/', SCRIPT_NAME => '', SERVER_PROTOCOL => 'HTTP/1.0', }, 'multiline'); # dumb HTTP client: https://github.com/plack/Plack/issues/213 $req = <<"EOT"; GET /a/b#c HTTP/1.0\r \r EOT %env = (); is(parse_http_request($req, \%env), length($req), 'URI fragment'); is_deeply(\%env, { SCRIPT_NAME => '', PATH_INFO => '/a/b', REQUEST_METHOD => 'GET', REQUEST_URI => '/a/b#c', QUERY_STRING => '', SCRIPT_NAME => '', SERVER_PROTOCOL => 'HTTP/1.0', }); $req = <<"EOT"; GET /a/b%23c HTTP/1.0\r \r EOT %env = (); is(parse_http_request($req, \%env), length($req), '%23 -> #'); is_deeply(\%env, { SCRIPT_NAME => '', PATH_INFO => '/a/b#c', REQUEST_METHOD => 'GET', REQUEST_URI => '/a/b%23c', QUERY_STRING => '', SCRIPT_NAME => '', SERVER_PROTOCOL => 'HTTP/1.0', }); $req = <<"EOT"; GET /a/b?c=d#e HTTP/1.0\r \r EOT %env = (); is(parse_http_request($req, \%env), length($req), 'URI fragment after query string'); is_deeply(\%env, { SCRIPT_NAME => '', PATH_INFO => '/a/b', REQUEST_METHOD => 'GET', REQUEST_URI => '/a/b?c=d#e', QUERY_STRING => 'c=d', SCRIPT_NAME => '', SERVER_PROTOCOL => 'HTTP/1.0', }); my $w; { local $SIG{__WARN__} = sub { $w = shift }; $req = "GET /foo HTTP/1.0\r\n\r\n"; parse_http_request($req, \%env); } ok !$w; done_testing;