Skip to content

Commit

Permalink
add completed method to Mojo::Transaction
Browse files Browse the repository at this point in the history
  • Loading branch information
kraih committed Jan 11, 2016
1 parent 5f40612 commit 966f804
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 21 deletions.
1 change: 1 addition & 0 deletions Changes
Expand Up @@ -11,6 +11,7 @@
attribute.
- Added SNI support to all built-in web servers. (bpmedley, sri)
- Added module Mojo::WebSocket. (batman)
- Added completed method to Mojo::Transaction.
- Updated jQuery to version 2.2.0.
- Improved performance of Mojo::Server::Daemon and Mojo::UserAgent slightly.
- Improved mtime attribute in Mojo::Asset::Memory to default to the value of
Expand Down
17 changes: 12 additions & 5 deletions lib/Mojo/Transaction.pm
Expand Up @@ -15,6 +15,8 @@ sub client_close { shift->server_close }
sub client_read { croak 'Method "client_read" not implemented by subclass' }
sub client_write { croak 'Method "client_write" not implemented by subclass' }

sub completed { ++$_[0]{completed} and return $_[0] }

sub connection {
my $self = shift;
return $self->emit(connection => $self->{connection} = shift) if @_;
Expand All @@ -23,7 +25,7 @@ sub connection {

sub error { $_[0]->req->error || $_[0]->res->error }

sub is_finished { (shift->{state} // '') eq 'finished' }
sub is_finished { !!shift->{completed} }

sub is_websocket {undef}

Expand All @@ -39,16 +41,15 @@ sub remote_address {
: $self->original_remote_address;
}

sub resume { shift->_state('write')->emit('resume') }
sub server_close { shift->_state('finished')->emit('finish') }
sub resume { ++$_[0]{writing} and return $_[0]->emit('resume') }

sub server_close { shift->completed->emit('finish') }

sub server_read { croak 'Method "server_read" not implemented by subclass' }
sub server_write { croak 'Method "server_write" not implemented by subclass' }

sub success { $_[0]->error ? undef : $_[0]->res }

sub _state { $_[0]{state} = $_[1] and return $_[0] }

1;

=encoding utf8
Expand Down Expand Up @@ -183,6 +184,12 @@ Meant to be overloaded in a subclass.
Write data client-side, used to implement user agents such as
L<Mojo::UserAgent>. Meant to be overloaded in a subclass.
=head2 completed
$tx = $tx->completed;
Finalize transaction.
=head2 connection
my $id = $tx->connection;
Expand Down
12 changes: 5 additions & 7 deletions lib/Mojo/Transaction/HTTP.pm
Expand Up @@ -29,7 +29,7 @@ sub client_read {
return unless $res->parse($chunk)->is_finished;

# Unexpected 1xx response
return $self->{state} = 'finished'
return $self->completed
if !$res->is_status_class(100) || $res->headers->upgrade;
$self->res($res->new)->emit(unexpected => $res);
return if (my $leftovers = $res->content->leftovers) eq '';
Expand Down Expand Up @@ -71,7 +71,6 @@ sub server_read {
# Parse request
my $req = $self->req;
$req->parse($chunk) unless $req->error;
$self->{state} ||= 'read';

# Generate response
$self->emit('request') if $req->is_finished && !$self->{handled}++;
Expand All @@ -89,10 +88,10 @@ sub _body {
$self->{offset} += $written;

# Delayed
$self->{state} = 'read' unless defined $buffer;
$self->{writing} = 0 unless defined $buffer;

# Finished
$self->{state} = $finish ? 'finished' : 'read'
$finish ? $self->completed : ($self->{writing} = 0)
if $self->{write} <= 0 || defined $buffer && $buffer eq '';

return $buffer // '';
Expand All @@ -112,7 +111,7 @@ sub _headers {
$self->{offset} = 0;

# Response without body
if ($head && $self->is_empty) { $self->{state} = 'finished' }
if ($head && $self->is_empty) { $self->completed }

# Body
else {
Expand Down Expand Up @@ -144,8 +143,7 @@ sub _write {
my ($self, $server) = @_;

# Client starts writing right away
$self->{state} ||= 'write' unless $server;
return '' unless $self->{state} eq 'write';
return '' unless $server ? $self->{writing} : ($self->{writing} //= 1);

# Nothing written yet
$self->{$_} ||= 0 for qw(offset write);
Expand Down
13 changes: 4 additions & 9 deletions lib/Mojo/Transaction/WebSocket.pm
Expand Up @@ -106,8 +106,7 @@ sub send {
}

sub server_close {
my $self = shift;
$self->{state} = 'finished';
my $self = shift->completed;
return $self->emit(finish => $self->{close} ? (@{$self->{close}}) : 1006);
}

Expand All @@ -128,13 +127,9 @@ sub server_read {

sub server_write {
my $self = shift;

unless (length($self->{write} // '')) {
$self->{state} = $self->{finished} ? 'finished' : 'read';
$self->emit('drain');
}

return delete $self->{write} // '';
$self->emit('drain') if ($self->{write} //= '') eq '';
$self->completed if $self->{write} eq '' && $self->{finished};
return delete $self->{write};
}

sub with_compression {
Expand Down

0 comments on commit 966f804

Please sign in to comment.