{
my $conn = shift;
my $callback = shift;
- $conn->{sock}->on(error => sub {$callback->($conn, $_[1]);});
+ $conn->{sock}->on(error => sub {$callback->($_[1]);});
}
sub set_on_eof
{
my $conn = shift;
my $callback = shift;
- $conn->{sock}->on(close => sub {$callback->($conn);});
+ $conn->{sock}->on(close => sub {$callback->()});
}
sub set_rproc
$sock->on(close => sub {$conn->disconnect;});
$sock->timeout(0);
$sock->start;
+ $conn->{peerhost} = eval { $handle->peerhost; };
dbg((ref $conn) . " connected $conn->{cnum} to $conn->{peerhost}:$conn->{peerport}") if isdbg('connll');
if ($conn->{on_connect}) {
- &{$conn->{on_connect}}($conn);
+ &{$conn->{on_connect}}($conn, $handle);
}
}
}
sub connect {
- my ($pkg, $to_host, $to_port, $rproc, %args) = @_;
+ my ($pkg, $to_host, $to_port, %args) = @_;
my $timeout = delete $args{timeout} || $connect_timeout;
# Create a connection end-point object
my $conn = $pkg;
unless (ref $pkg) {
+ my $rproc = delete $args{rproc};
$conn = $pkg->new($rproc);
}
$conn->{peerhost} = $to_host;
my $sock;
$conn->{sock} = $sock = Mojo::IOLoop::Client->new;
$sock->on(connect => sub {$conn->_on_connect($_[1])} );
- $sock->on(error => sub {$conn->disconnect});
+ $sock->on(error => sub {&{$conn->{eproc}}($conn, $_[1]) if exists $conn->{eproc}; $conn->disconnect});
$sock->on(close => sub {$conn->disconnect});
# copy any args like on_connect, on_disconnect etc
}
}
- if (defined($sock)) {
- $sock->close_gracefully;
- }
+ $sock->close_gracefully if defined $sock && $sock->can('close_gracefully');
+ undef $sock;
unless ($main::is_win) {
kill 'TERM', $conn->{pid} if exists $conn->{pid};
sub new_client {
my $server_conn = shift;
- my $client = shift;
+ my $handle = shift;
my $conn = $server_conn->new($server_conn->{rproc});
- my $sock = $conn->{sock} = Mojo::IOLoop::Stream->new($client);
+ my $sock = $conn->{sock} = Mojo::IOLoop::Stream->new($handle);
$sock->on(read => sub {$conn->_rcv($_[1])});
$sock->timeout(0);
$sock->start;
dbg((ref $conn) . "accept $conn->{cnum} from $conn->{peerhost} $conn->{peerport}") if isdbg('connll');
- my ($rproc, $eproc) = &{$server_conn->{rproc}} ($conn, $conn->{peerhost} = $client->peerhost, $conn->{peerport} = $client->peerport);
+ my ($rproc, $eproc) = &{$server_conn->{rproc}} ($conn, $conn->{peerhost} = $handle->peerhost, $conn->{peerport} = $handle->peerport);
$conn->{sort} = 'Incoming';
if ($eproc) {
$conn->{eproc} = $eproc;
my $call = $conn->{call} || 'unallocated';
my $host = $conn->{peerhost} || '';
my $port = $conn->{peerport} || '';
+ my $sock = $conn->{sock};
+
+ $sock->close_gracefully if defined $sock && $sock->can('close_gracefully');
+
$noconns--;
dbg((ref $conn) . " Connection $conn->{cnum} $call [$host $port] being destroyed (total $noconns)") if isdbg('connll');
}