diff options
author | Eric Wong <e@80x24.org> | 2017-01-13 23:10:25 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2019-01-22 03:40:18 +0000 |
commit | 891c6f0d5c47e93166cfd8b29785ebb1f0545119 (patch) | |
tree | ce38380c1abb87b0a1e9ebe31876a8f03f417bcf | |
parent | 21235aaf76ff3b5d7f400b65c8aa793f6b6a002c (diff) | |
download | public-inbox-891c6f0d5c47e93166cfd8b29785ebb1f0545119.tar.gz |
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.
-rw-r--r-- | lib/PublicInbox/HTTPD/Async.pm | 16 |
1 files changed, 9 insertions, 7 deletions
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}; } |