| Mojolicious documentation | Contained in the Mojolicious distribution. |
Mojo::Transaction - Transaction Base Class
use Mojo::Base 'Mojo::Transaction';
Mojo::Transaction is an abstract base class for transactions.
Mojo::Transaction implements the following attributes.
connectionmy $connection = $tx->connection; $tx = $tx->connection($connection);
Connection identifier or socket.
keep_alivemy $keep_alive = $tx->keep_alive; $tx = $tx->keep_alive(1);
Connection can be kept alive.
kept_alivemy $kept_alive = $tx->kept_alive; $tx = $tx->kept_alive(1);
Connection has been kept alive.
local_addressmy $local_address = $tx->local_address; $tx = $tx->local_address($address);
Local interface address.
local_portmy $local_port = $tx->local_port; $tx = $tx->local_port($port);
Local interface port.
on_finish my $cb = $tx->on_finish;
$tx = $tx->on_finish(sub {...});
Callback to be invoked when the transaction has been finished.
$tx->on_finish(sub {
my $self = shift;
});
on_resume my $cb = $tx->on_resume;
$tx = $tx->on_resume(sub {...});
Callback to be invoked whenever the transaction is resumed.
previousmy $previous = $tx->previous; $tx = $tx->previous(Mojo::Transaction->new);
Previous transaction that triggered this followup transaction.
remote_addressmy $remote_address = $tx->remote_address; $tx = $tx->remote_address($address);
Remote interface address.
remote_portmy $remote_port = $tx->remote_port; $tx = $tx->remote_port($port);
Remote interface port.
Mojo::Transaction inherits all methods from Mojo::Base and implements the following new ones.
client_read$tx = $tx->client_read($chunk);
Read and process client data.
client_writemy $chunk = $tx->client_write;
Write client data.
errormy $message = $message->error; my ($message, $code) = $message->error;
Parser errors and codes.
is_donemy $done = $tx->is_done;
Check if transaction is done.
is_websocketmy $is_websocket = $tx->is_websocket;
Check if transaction is a WebSocket.
is_writingmy $writing = $tx->is_writing;
Check if transaction is writing.
reqmy $req = $tx->req;
Transaction request, usually a Mojo::Message::Request object.
resmy $res = $tx->res;
Transaction response, usually a Mojo::Message::Response object.
resume$tx = $tx->resume;
Resume transaction.
server_close$tx = $tx->server_close;
Transaction closed.
server_read$tx = $tx->server_read($chunk);
Read and process server data.
server_writemy $chunk = $tx->server_write;
Write server data.
successmy $res = $tx->success;
Returns the Mojo::Message::Response object (res) if transaction was
successful or undef otherwise.
Connection and parser errors have only a message in error, 400 and 500
responses also a code.
if (my $res = $tx->success) {
print $res->body;
}
else {
my ($message, $code) = $tx->error;
if ($code) {
print "$code $message response.\n";
}
else {
print "Connection error: $message\n";
}
}
Error messages can be accessed with the error method of the transaction
object.
Mojolicious, Mojolicious::Guides, http://mojolicio.us.
| Mojolicious documentation | Contained in the Mojolicious distribution. |
package Mojo::Transaction; use Mojo::Base -base; use Carp 'croak'; has [qw/connection kept_alive local_address local_port previous remote_port/]; has [qw/on_finish on_resume/] => sub { sub {1} }; has keep_alive => 0; # "Please don't eat me! I have a wife and kids. Eat them!" sub client_read { croak 'Method "client_read" not implemented by subclass' } sub client_write { croak 'Method "client_write" not implemented by subclass' } sub error { my $self = shift; my $req = $self->req; return $req->error if $req->error; my $res = $self->res; return $res->error if $res->error; undef; } sub is_done { return 1 if (shift->{_state} || '') eq 'done'; undef; } sub is_websocket {0} sub is_writing { return 1 unless my $state = shift->{_state}; return 1 if $state eq 'write' || $state eq 'write_start_line' || $state eq 'write_headers' || $state eq 'write_body'; undef; } sub remote_address { my ($self, $address) = @_; # Set if ($address) { $self->{remote_address} = $address; return $self; } # Reverse proxy if ($ENV{MOJO_REVERSE_PROXY}) { # Forwarded my $forwarded = $self->{_forwarded_for}; return $forwarded if $forwarded; # Reverse proxy if ($forwarded = $self->req->headers->header('X-Forwarded-For')) { # Real address if ($forwarded =~ /([^,\s]+)$/) { $self->{_forwarded_for} = $1; return $1; } } } # Get $self->{remote_address}; } sub req { croak 'Method "req" not implemented by subclass' } sub res { croak 'Method "res" not implemented by subclass' } sub resume { my $self = shift; # Delayed if (($self->{_state} || '') eq 'paused') { $self->{_state} = 'write_body'; } # Writing elsif (!$self->is_writing) { $self->{_state} = 'write' } # Callback $self->on_resume->($self); $self; } sub server_close { my $self = shift; $self->on_finish->($self); $self; } sub server_read { croak 'Method "server_read" not implemented by subclass' } sub server_write { croak 'Method "server_write" not implemented by subclass' } sub success { my $self = shift; return $self->res unless $self->error; undef; } 1; __END__