Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
fixed small HTTP response parser bug
  • Loading branch information
kraih committed Oct 20, 2011
1 parent d80f166 commit 78e925d
Show file tree
Hide file tree
Showing 3 changed files with 98 additions and 7 deletions.
3 changes: 2 additions & 1 deletion Changes
@@ -1,7 +1,8 @@
This file documents the revision history for Perl extension Mojolicious.

2.04 2011-10-20 00:00:00
2.04 2011-10-21 00:00:00
- Improved documentation.
- Fixed small HTTP response parser bug.

2.03 2011-10-20 00:00:00
- Deprecated all is_done methods in favor of is_finished.
Expand Down
10 changes: 5 additions & 5 deletions lib/Mojo/Message/Response.pm
Expand Up @@ -144,21 +144,21 @@ sub _parse_start_line {
my $self = shift;

# Try to detect HTTP 0.9
$self->{state} = 'content';
if ($self->{buffer} !~ /^\s*HTTP\//) {
if ($self->{buffer} =~ /^\s*(\S.{4})/ && $1 !~ /^HTTP\//) {
$self->version('0.9');
return $self->content->relaxed(1);
$self->content->relaxed(1);
return $self->{state} = 'content';
}

# We have a full HTTP 1.0+ response line
my $line = get_line $self->{buffer};
return unless defined $line;
return unless defined(my $line = get_line $self->{buffer});
return $self->error('Bad response start line.')
unless $line =~ $START_LINE_RE;
$self->version($1);
$self->code($2);
$self->message($3);
$self->content->auto_relax(1);
$self->{state} = 'content';
}

1;
Expand Down
92 changes: 91 additions & 1 deletion t/mojo/message.t
Expand Up @@ -3,7 +3,7 @@ use Mojo::Base -strict;

use utf8;

use Test::More tests => 1263;
use Test::More tests => 1310;

use File::Spec;
use File::Temp;
Expand Down Expand Up @@ -137,6 +137,50 @@ is $req->at_least_version('1.1'), 1, 'at least version 1.1';
is $req->at_least_version('1.2'), undef, 'not version 1.2';
is $req->url, '/', 'right URL';

# Parse HTTP 1.1 start line, no headers and body (small chunks)
$req = Mojo::Message::Request->new;
$req->parse('G');
ok !$req->is_finished, 'request is not finished';
$req->parse('E');
ok !$req->is_finished, 'request is not finished';
$req->parse('T');
ok !$req->is_finished, 'request is not finished';
$req->parse(' ');
ok !$req->is_finished, 'request is not finished';
$req->parse('/');
ok !$req->is_finished, 'request is not finished';
$req->parse(' ');
ok !$req->is_finished, 'request is not finished';
$req->parse('H');
ok !$req->is_finished, 'request is not finished';
$req->parse('T');
ok !$req->is_finished, 'request is not finished';
$req->parse('T');
ok !$req->is_finished, 'request is not finished';
$req->parse('P');
ok !$req->is_finished, 'request is not finished';
$req->parse('/');
ok !$req->is_finished, 'request is not finished';
$req->parse('1');
ok !$req->is_finished, 'request is not finished';
$req->parse('.');
ok !$req->is_finished, 'request is not finished';
$req->parse('1');
ok !$req->is_finished, 'request is not finished';
$req->parse("\x0d");
ok !$req->is_finished, 'request is not finished';
$req->parse("\x0a");
ok !$req->is_finished, 'request is not finished';
$req->parse("\x0d");
ok !$req->is_finished, 'request is not finished';
$req->parse("\x0a");
ok $req->is_finished, 'request is finished';
is $req->method, 'GET', 'right method';
is $req->version, '1.1', 'right version';
is $req->at_least_version('1.1'), 1, 'at least version 1.1';
is $req->at_least_version('1.2'), undef, 'not version 1.2';
is $req->url, '/', 'right URL';

# Parse pipelined HTTP 1.1 start line, no headers and body
$req = Mojo::Message::Request->new;
$req->parse("GET / HTTP/1.1\x0d\x0a\x0d\x0aGET / HTTP/1.1\x0d\x0a\x0d\x0a");
Expand Down Expand Up @@ -1395,6 +1439,52 @@ is $res->version, '1.1', 'right version';
is $res->at_least_version('1.0'), 1, 'at least version 1.0';
is $res->at_least_version('1.2'), undef, 'not version 1.2';

# Parse HTTP 1.1 response start line, no headers and body (small chunks)
$res = Mojo::Message::Response->new;
$res->parse('H');
ok !$res->is_finished, 'response is not finished';
$res->parse('T');
ok !$res->is_finished, 'response is not finished';
$res->parse('T');
ok !$res->is_finished, 'response is not finished';
$res->parse('P');
ok !$res->is_finished, 'response is not finished';
$res->parse('/');
ok !$res->is_finished, 'response is not finished';
$res->parse('1');
ok !$res->is_finished, 'response is not finished';
$res->parse('.');
ok !$res->is_finished, 'response is not finished';
$res->parse('1');
ok !$res->is_finished, 'response is not finished';
$res->parse(' ');
ok !$res->is_finished, 'response is not finished';
$res->parse('2');
ok !$res->is_finished, 'response is not finished';
$res->parse('0');
ok !$res->is_finished, 'response is not finished';
$res->parse('0');
ok !$res->is_finished, 'response is not finished';
$res->parse(' ');
ok !$res->is_finished, 'response is not finished';
$res->parse('O');
ok !$res->is_finished, 'response is not finished';
$res->parse('K');
ok !$res->is_finished, 'response is not finished';
$res->parse("\x0d");
ok !$res->is_finished, 'response is not finished';
$res->parse("\x0a");
ok !$res->is_finished, 'response is not finished';
$res->parse("\x0d");
ok !$res->is_finished, 'response is not finished';
$res->parse("\x0a");
ok $res->is_finished, 'response is finished';
is $res->code, 200, 'right status';
is $res->message, 'OK', 'right message';
is $res->version, '1.1', 'right version';
is $res->at_least_version('1.0'), 1, 'at least version 1.0';
is $res->at_least_version('1.2'), undef, 'not version 1.2';

# Parse HTTP 1.1 response start line, no headers and body (no message)
$res = Mojo::Message::Response->new;
$res->parse("HTTP/1.1 200\x0d\x0a\x0d\x0a");
Expand Down

0 comments on commit 78e925d

Please sign in to comment.