Mojolicious

 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 distribution
 view release on metacpan -  search on metacpan

( run in 0.501 second using v1.00-cache-2.02-grep-82fe00e-cpan-c30982ac1bc3 )