about summary refs log tree commit homepage
path: root/lib/PublicInbox/HTTP.pm
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2016-05-30 04:39:57 +0000
committerEric Wong <e@80x24.org>2016-05-30 04:46:23 +0000
commit56692b57c4e6a404fee0ec8eef857f35e09ce767 (patch)
treeba5a3c77f8995122110fa18780b47cad5618c81b /lib/PublicInbox/HTTP.pm
parent1cf14fe543ad6259003cdd1995a1c83a7a70b535 (diff)
downloadpublic-inbox-56692b57c4e6a404fee0ec8eef857f35e09ce767.tar.gz
http: yield body->getline running time
We cannot let a client monopolize the single-threaded server
even if it can drain the socket buffer faster than we can
emit data.

While we're at it, acknowledge the this behavior (which happens
naturally) in httpd/async.

The same idea is present in NNTP for the long_response code.

This is the HTTP followup to:
commit 0d0fde0bff97 ("nntp: introduce long response API for streaming")
commit 79d8bfedcdd2 ("nntp: avoid signals for long responses")
Diffstat (limited to 'lib/PublicInbox/HTTP.pm')
-rw-r--r--lib/PublicInbox/HTTP.pm5
1 files changed, 4 insertions, 1 deletions
diff --git a/lib/PublicInbox/HTTP.pm b/lib/PublicInbox/HTTP.pm
index fcbd758a..6df1c3fc 100644
--- a/lib/PublicInbox/HTTP.pm
+++ b/lib/PublicInbox/HTTP.pm
@@ -265,10 +265,13 @@ sub getline_response {
         my $pull = $self->{pull} = sub {
                 local $/ = \8192;
                 my $forward = $self->{forward};
+                # limit our own running time for fairness with other
+                # clients and to avoid buffering too much:
+                my $n = 100;
                 while ($forward && defined(my $buf = $forward->getline)) {
                         $write->($buf);
                         last if $self->{closed};
-                        if ($self->{write_buf_size}) {
+                        if ((--$n) <= 0 || $self->{write_buf_size}) {
                                 $self->write($self->{pull});
                                 return;
                         }