Mojolicious
view release on metacpan - search on metacpan
view release on metacpan or search on metacpan
t/mojo/request.t view on Meta::CPAN
subtest 'Parse HTTP 1.1 message with headers exceeding line limit' => sub {
local $ENV{MOJO_MAX_LINES} = 5;
my $req = Mojo::Message::Request->new;
is $req->headers->max_lines, 5, 'right number';
$req->parse("GET / HTTP/1.1\x0d\x0a");
$req->parse("A: a\x0d\x0aB: b\x0d\x0aC: c\x0d\x0aD: d\x0d\x0a");
ok !$req->is_limit_exceeded, 'limit is not exceeded';
$req->parse("D: d\x0d\x0a\x0d\x0a");
ok $req->is_finished, 'request is finished';
is $req->error->{message}, 'Maximum header size exceeded', 'right error';
ok $req->is_limit_exceeded, 'limit is exceeded';
is $req->method, 'GET', 'right method';
is $req->version, '1.1', 'right version';
is $req->url, '/', 'right URL';
};
subtest 'Parse full HTTP 1.0 request (solitary LF)' => sub {
my $req = Mojo::Message::Request->new;
my $body = '';
$req->content->on(read => sub { $body .= pop });
$req->parse('GET /foo/bar/baz.html?fo');
$req->parse("o=13 HTTP/1.0\x0aContent");
$req->parse('-Type: text/');
$req->parse("plain\x0aContent-Length: 27\x0a\x0aH");
$req->parse("ello World!\n1234\nlalalala\n");
ok $req->is_finished, 'request is finished';
is $req->method, 'GET', 'right method';
is $req->version, '1.0', 'right version';
is $req->url, '/foo/bar/baz.html?foo=13', 'right URL';
is $req->headers->content_type, 'text/plain', 'right "Content-Type" value';
is $req->headers->content_length, 27, 'right "Content-Length" value';
is $req->body, "Hello World!\n1234\nlalalala\n", 'right content';
is $body, "Hello World!\n1234\nlalalala\n", 'right content';
};
subtest 'Parse full HTTP 1.0 request (no scheme and empty elements in path)' => sub {
my $req = Mojo::Message::Request->new;
$req->parse('GET //foo/bar//baz.html?fo');
$req->parse("o=13 HTTP/1.0\x0d\x0aContent");
$req->parse('-Type: text/');
$req->parse("plain\x0d\x0aContent-Length: 27\x0d\x0a\x0d\x0aHell");
$req->parse("o World!\n1234\nlalalala\n");
ok $req->is_finished, 'request is finished';
is $req->method, 'GET', 'right method';
is $req->version, '1.0', 'right version';
is $req->url->host, undef, 'no host';
is $req->url->path, '//foo/bar//baz.html', 'right path';
is $req->url, '//foo/bar//baz.html?foo=13', 'right URL';
is $req->headers->content_type, 'text/plain', 'right "Content-Type" value';
is $req->headers->content_length, 27, 'right "Content-Length" value';
};
subtest 'Parse full HTTP 1.0 request (behind reverse proxy)' => sub {
my $req = Mojo::Message::Request->new;
$req->parse('GET /foo/bar/baz.html?fo');
$req->parse("o=13 HTTP/1.0\x0d\x0aContent");
$req->parse('-Type: text/');
$req->parse("plain\x0d\x0aContent-Length: 27\x0d\x0a");
$req->parse("Host: mojolicious.org\x0d\x0a");
$req->parse("X-Forwarded-For: 192.168.2.1, 127.0.0.1\x0d\x0a\x0d\x0a");
$req->parse("Hello World!\n1234\nlalalala\n");
ok $req->is_finished, 'request is finished';
is $req->method, 'GET', 'right method';
is $req->version, '1.0', 'right version';
is $req->url, '/foo/bar/baz.html?foo=13', 'right URL';
is $req->url->to_abs, 'http://mojolicious.org/foo/bar/baz.html?foo=13', 'right absolute URL';
is $req->headers->content_type, 'text/plain', 'right "Content-Type" value';
is $req->headers->content_length, 27, 'right "Content-Length" value';
};
subtest 'Parse full HTTP 1.0 request with zero chunk' => sub {
my $req = Mojo::Message::Request->new;
my $finished = undef;
$req->on(finish => sub { $finished = shift->is_finished });
$req->parse('GET /foo/bar/baz.html?fo');
$req->parse("o=13 HTTP/1.0\x0d\x0aContent");
$req->parse('-Type: text/');
$req->parse("plain\x0d\x0aContent-Length: 27\x0d\x0a\x0d\x0aHell");
$req->parse("o World!\n123");
$req->parse('0');
$req->parse("\nlalalala\n");
ok $finished, 'finish event has been emitted';
ok $req->is_finished, 'request is finished';
is $req->method, 'GET', 'right method';
is $req->version, '1.0', 'right version';
is $req->url, '/foo/bar/baz.html?foo=13', 'right URL';
is $req->headers->content_type, 'text/plain', 'right "Content-Type" value';
is $req->headers->content_length, 27, 'right "Content-Length" value';
};
subtest 'Parse full HTTP 1.0 request with UTF-8 form input' => sub {
my $req = Mojo::Message::Request->new;
$req->parse('GET /foo/bar/baz.html?fo');
$req->parse("o=13 HTTP/1.0\x0d\x0aContent");
$req->parse('-Type: application/');
$req->parse("x-www-form-urlencoded\x0d\x0aContent-Length: 14");
$req->parse("\x0d\x0a\x0d\x0a");
$req->parse('name=%E2%98%83');
ok $req->is_finished, 'request is finished';
is $req->method, 'GET', 'right method';
is $req->version, '1.0', 'right version';
is $req->url, '/foo/bar/baz.html?foo=13', 'right URL';
is $req->headers->content_type, 'application/x-www-form-urlencoded', 'right "Content-Type" value';
is $req->headers->content_length, 14, 'right "Content-Length" value';
is $req->param('name'), 'â', 'right value';
};
subtest 'Parse HTTP 1.1 gzip compressed request (no decompression)' => sub {
my $compressed = gzip my $uncompressed = 'abc' x 1000;
my $req = Mojo::Message::Request->new;
$req->parse("POST /foo HTTP/1.1\x0d\x0a");
$req->parse("Content-Type: text/plain\x0d\x0a");
$req->parse("Content-Length: @{[length $compressed]}\x0d\x0a");
$req->parse("Content-Encoding: GZip\x0d\x0a\x0d\x0a");
ok $req->content->is_compressed, 'content is compressed';
$req->parse($compressed);
ok $req->content->is_compressed, 'content is still compressed';
ok $req->is_finished, 'request is finished';
is $req->method, 'POST', 'right method';
is $req->version, '1.1', 'right version';
view all matches for this distributionview release on metacpan - search on metacpan
( run in 0.501 second using v1.00-cache-2.02-grep-82fe00e-cpan-c30982ac1bc3 )