Skip to content

Commit

Permalink
improved Mojo::Transaction::HTTP performance slightly
Browse files Browse the repository at this point in the history
  • Loading branch information
kraih committed Sep 15, 2012
1 parent 4fa57db commit f98710b
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 32 deletions.
9 changes: 3 additions & 6 deletions lib/Mojo/Message.pm
Expand Up @@ -198,13 +198,10 @@ sub param { shift->body_params->param(@_) }
sub parse {
my ($self, $chunk) = @_;

# Add chunk
$self->{raw_size} += length($chunk //= '');
$self->{buffer} .= $chunk;

# Check message size
# Check message size and add chunk
return $self->error('Maximum message size exceeded', 413)
if $self->{raw_size} > $self->max_message_size;
if ($self->{raw_size} += length($chunk //= '')) > $self->max_message_size;
$self->{buffer} .= $chunk;

# Start line
unless ($self->{state}) {
Expand Down
35 changes: 10 additions & 25 deletions lib/Mojo/Transaction/HTTP.pm
Expand Up @@ -6,30 +6,23 @@ use Mojo::Transaction::WebSocket;
sub client_read {
my ($self, $chunk) = @_;

# EOF
my $preserved = $self->{state};
$self->{state} = 'finished' if length $chunk == 0;

# Generate response without body for HEAD request
# Skip body for HEAD request
my $res = $self->res;
$res->content->skip_body(1) if $self->req->method eq 'HEAD';

# Parse response
$res->parse($chunk);
$self->{state} = 'finished' if $res->is_finished;
my $state = $self->{state};
$self->{state} = 'finished' if $res->parse($chunk)->is_finished;

# Unexpected 100 Continue
$self->res($res->new)->{state} = $preserved
$self->res($res->new)->{state} = $state
if $self->{state} eq 'finished' && ($res->code // '') eq '100';

# Check for errors
$self->{state} = 'finished' if $self->error;
}

sub client_write {
my $self = shift;

# Writing
# Start writing
$self->{$_} ||= 0 for qw(offset write);
my $req = $self->req;
unless ($self->{state}) {
Expand Down Expand Up @@ -87,13 +80,8 @@ sub server_read {
$req->parse($chunk) unless $req->error;
$self->{state} ||= 'read';

# Parser error
if ($req->error && !$self->{handled}++) {
$self->emit('request')->res->headers->connection('close');
}

# EOF
elsif ((length $chunk == 0) || ($req->is_finished && !$self->{handled}++)) {
if ($req->is_finished && !$self->{handled}++) {
$self->emit(
upgrade => Mojo::Transaction::WebSocket->new(handshake => $self))
if lc($req->headers->upgrade || '') eq 'websocket';
Expand Down Expand Up @@ -136,10 +124,8 @@ sub server_write {
$chunk .= $self->_headers($res, 1);

# Continued
if (defined $self->{continued} && !$self->{continued}) {
$self->{continued} = $self->{state} = 'read';
$self->res($self->res->new);
}
$self->res($self->res->new)->{continued} = $self->{state} = 'read'
if defined $self->{continued} && !$self->{continued};
}

# Body
Expand All @@ -160,9 +146,8 @@ sub _body {

# Delayed
else {
my $delay = delete $self->{delay};
$self->{state} = 'paused' if $delay;
$self->{delay} = 1 unless $delay;
if (delete $self->{delay}) { $self->{state} = 'paused' }
else { $self->{delay} = 1 }
}

# Finished
Expand Down
3 changes: 2 additions & 1 deletion t/mojolicious/lite_app.t
Expand Up @@ -9,7 +9,7 @@ BEGIN {
$ENV{MOJO_REACTOR} = 'Mojo::Reactor::Poll';
}

use Test::More tests => 704;
use Test::More tests => 705;

use Mojo::ByteStream 'b';
use Mojo::Cookie::Response;
Expand Down Expand Up @@ -905,6 +905,7 @@ $t->get_ok('/source?fail=1')->status_is(404)->content_is('does not exist!');
{
local $ENV{MOJO_MAX_MESSAGE_SIZE} = 1024;
$t->get_ok('/', '1234' x 1024)->status_is(413)
->header_is(Connection => 'close')
->content_is(
"/root.html\n/root.html\n/root.html\n/root.html\n/root.html\n");
}
Expand Down

0 comments on commit f98710b

Please sign in to comment.