$cnum = 0;
$connect_timeout = 5;
-$disc_waittime = 3;
+$disc_waittime = 1.5;
our %delqueue;
$sock->timeout(0);
$sock->start;
$conn->{peerhost} = eval { $handle->peerhost; };
- dbg((ref $conn) . " connected $conn->{cnum} to $conn->{peerhost}:$conn->{peerport}") if isdbg('connll');
+ dbg((ref $conn) . " connected $conn->{cnum} to $conn->{peerhost}:$conn->{peerport}") if isdbg('conn') || isdbg ('connect');
if ($conn->{on_connect}) {
&{$conn->{on_connect}}($conn, $handle);
}
my $sock;
$conn->{sock} = $sock = Mojo::IOLoop::Client->new;
- $sock->on(connect => sub {$conn->_on_connect($_[1])} );
- $sock->on(error => sub {&{$conn->{eproc}}($conn, $_[1]) if exists $conn->{eproc}; $conn->disconnect});
- $sock->on(close => sub {$conn->disconnect});
+ $sock->on(connect => sub {
+ $conn->_on_connect($_[1])
+ } );
+ $sock->on(error => sub {
+ &{$conn->{eproc}}($conn, $_[1]) if exists $conn->{eproc};
+ delete $conn->{sock};
+ $conn->disconnect
+ });
+ $sock->on(close => sub {
+ delete $conn->{sock};
+ $conn->disconnect}
+ );
# copy any args like on_connect, on_disconnect etc
while (my ($k, $v) = each %args) {
{
my $conn = shift;
my $count = $conn->{disconnecting}++;
- if (isdbg('connll')) {
- my ($pkg, $fn, $line) = caller;
- dbg((ref $conn) . "::disconnect on call $conn->{call} attempt $conn->{disconnecting} called from ${pkg}::${fn} line $line ");
+ my $dbg = isdbg('connll');
+ my ($pkg, $fn, $line) = caller if $dbg;
+
+ if ($count >= 2) {
+ dbg((ref $conn) . "::disconnect on call $conn->{call} attempt $conn->{disconnecting} called from ${pkg}::${fn} line $line FORCING CLOSE ") if $dbg;
+ _close_it($conn);
+ return;
}
+ dbg((ref $conn) . "::disconnect on call $conn->{call} attempt $conn->{disconnecting} called from ${pkg}::${fn} line $line ") if $dbg;
return if $count;
-
+ # remove this conn from the active queue
+ # be careful to delete the correct one
+ my $call;
+ if ($call = $conn->{call}) {
+ my $ref = $conns{$call};
+ delete $conns{$call} if $ref && $ref == $conn;
+ }
+ $call ||= 'unallocated';
+
+ $delqueue{$conn} = $conn; # save this connection until everything is finished
my $sock = $conn->{sock};
if ($sock) {
-
- # remove me from the active list
- my $call;
- if ($call = $conn->{call}) {
- my $ref = $conns{$call};
- delete $conns{$call} if $ref && $ref == $conn;
+ if ($sock->{buffer}) {
+ my $lth = length $sock->{buffer};
+ Mojo::IOLoop->timer($disc_waittime, sub {
+ dbg("Buffer contained $lth characters, coordinated for $disc_waittime secs, now disconnecting $call") if $dbg;
+ _close_it($conn);
+ });
+ } else {
+ dbg("Buffer empty, just close $call") if $dbg;
+ _close_it($conn);
}
- $conn->{delay} = Mojo::IOLoop->delay (
-# Mojo::IOLoop->delay (
- sub {
- my $delay = shift;
- dbg("before drain $call");
- $sock->on(drain => $delay->begin);
- 1;
- },
- sub {
- my $delay = shift;
- _close_it($conn);
- 1;
- }
- );
- $conn->{delay}->wait;
-
- $delqueue{$conn} = $conn; # save this connection until everything is finished
} else {
- dbg((ref $conn) . " socket missing on $conn->{call}") if isdbg('connll');
+ dbg((ref $conn) . " socket missing on $conn->{call}") if $dbg;
_close_it($conn);
}
}
$conn->{state} = 'E';
$conn->{timeout}->del if $conn->{timeout};
+ my $call = $conn->{call};
+
if (isdbg('connll')) {
my ($pkg, $fn, $line) = caller;
dbg((ref $conn) . "::_close_it on call $conn->{call} attempt $conn->{disconnecting} called from ${pkg}::${fn} line $line ");
}
- # be careful to delete the correct one
- my $call;
- if ($call = $conn->{call}) {
- my $ref = $conns{$call};
- delete $conns{$call} if $ref && $ref == $conn;
- }
- $call ||= 'unallocated';
dbg((ref $conn) . " Connection $conn->{cnum} $call starting to close") if isdbg('connll');
$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} = $handle->peerhost, $conn->{peerport} = $handle->peerport);
+ $conn->{peerhost} = $handle->peerhost || 'unknown';
+ $conn->{peerhost} =~ s|^::ffff:||; # chop off leading pseudo IPV6 stuff on dual stack listeners
+ $conn->{peerport} = $handle->peerport || 0;
+ dbg((ref $conn) . " accept $conn->{cnum} from $conn->{peerhost}:$conn->{peerport}") if isdbg('conn') || isdbg('connect');
+ my ($rproc, $eproc) = &{$server_conn->{rproc}} ($conn, $conn->{peerhost}, $conn->{peerport});
$conn->{sort} = 'Incoming';
if ($eproc) {
$conn->{eproc} = $eproc;