]> git.ipfire.org Git - thirdparty/public-inbox.git/commitdiff
httpd/async: stop running command if client disconnects
authorEric Wong <e@80x24.org>
Fri, 13 Jan 2017 23:10:25 +0000 (23:10 +0000)
committerEric Wong <e@80x24.org>
Fri, 13 Jan 2017 23:11:57 +0000 (23:11 +0000)
If an HTTP client disconnects while we're piping the output of a
process to them, break the pipe of the process to reclaim
resources as soon as possible.

lib/PublicInbox/HTTPD/Async.pm

index d3de44295f849fbb9a562526b05506c80e3c0e2c..71175692b0b061a440dfb07bdaf099d3b6df7e85 100644 (file)
@@ -36,14 +36,16 @@ sub main_cb ($$$) {
                my $r = sysread($self->{sock}, $$bref, 8192);
                if ($r) {
                        $fh->write($$bref);
-                       return if $http->{closed};
-                       if ($http->{write_buf_size}) {
-                               $self->watch_read(0);
-                               $http->write(restart_read_cb($self));
+                       unless ($http->{closed}) { # Danga::Socket sets this
+                               if ($http->{write_buf_size}) {
+                                       $self->watch_read(0);
+                                       $http->write(restart_read_cb($self));
+                               }
+                               # stay in watch_read, but let other clients
+                               # get some work done, too.
+                               return;
                        }
-                       # stay in watch_read, but let other clients
-                       # get some work done, too.
-                       return;
+                       # fall through to close below...
                } elsif (!defined $r) {
                        return if $!{EAGAIN} || $!{EINTR};
                }