From: Eric Wong Date: Fri, 13 Jan 2017 23:10:25 +0000 (+0000) Subject: httpd/async: stop running command if client disconnects X-Git-Tag: v1.2.0~397^2~24 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=891c6f0d5c47e93166cfd8b29785ebb1f0545119;hp=21235aaf76ff3b5d7f400b65c8aa793f6b6a002c;p=public-inbox.git httpd/async: stop running command if client disconnects 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. --- diff --git a/lib/PublicInbox/HTTPD/Async.pm b/lib/PublicInbox/HTTPD/Async.pm index a9a9573b..a1f75518 100644 --- a/lib/PublicInbox/HTTPD/Async.pm +++ b/lib/PublicInbox/HTTPD/Async.pm @@ -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}; }