add first take on IP address remembering
[spider.git] / perl / Msg.pm
index b355845d1196ebccb13fbfa0636f996bc40e7050..09b0e634e6fc28c6f81ff4faac933e734ceb5109 100644 (file)
@@ -28,7 +28,8 @@ $now = time;
 
 $cnum = 0;
 $connect_timeout = 5;
-$disc_waittime = 3;
+$disc_waittime = 1.5;
+%conns;
 
 our %delqueue;
 
@@ -102,6 +103,12 @@ sub conns
        return $ref;
 }
 
+# this is called as a FUNCTION i.e my $conn = Msg::get($call);
+sub get
+{
+       return $conns{shift};
+}
+
 # this is only called by any dependent processes going away unexpectedly
 sub pid_gone
 {
@@ -276,31 +283,16 @@ sub disconnect
        $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") if $dbg;
-                                                                                                 $sock->on(drain => $delay->begin);
-                                                                                                 1;
-                                                                                         },
-                                                                                         sub {
-                                                                                                 my $delay = shift;
-                                                                                                 dbg("before _close_it $call") if $dbg;
-                                                                                                 _close_it($conn);
-                                                                                                 1;
-                                                                                         }
-                                                                                        );
-               $conn->{delay}->wait;
-
        } else {
                dbg((ref $conn) . " socket missing on $conn->{call}") if $dbg;
                _close_it($conn);
@@ -498,6 +490,7 @@ sub new_client {
        $sock->timeout(0);
        $sock->start;
        $conn->{peerhost} = $handle->peerhost;
+       $conn->{peerhost} =~ s|^::ffff:||; # chop off leading pseudo IPV6 stuff on dual stack listeners
        $conn->{peerport} = $handle->peerport;
        dbg((ref $conn) . " accept $conn->{cnum} from $conn->{peerhost}:$conn->{peerport}") if isdbg('connll');
        my ($rproc, $eproc) = &{$server_conn->{rproc}} ($conn, $conn->{peerhost}, $conn->{peerport});