about summary refs log tree commit homepage
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/PublicInbox/DS.pm4
-rw-r--r--lib/PublicInbox/HTTP.pm9
-rw-r--r--lib/PublicInbox/HTTPD/Async.pm17
3 files changed, 19 insertions, 11 deletions
diff --git a/lib/PublicInbox/DS.pm b/lib/PublicInbox/DS.pm
index 482710f7..7b87cd56 100644
--- a/lib/PublicInbox/DS.pm
+++ b/lib/PublicInbox/DS.pm
@@ -468,7 +468,7 @@ next_buf:
             }
         } else { #($ref eq 'CODE') {
             shift @$wbuf;
-            $bref->();
+            $bref->($self);
         }
     } # while @$wbuf
 
@@ -535,7 +535,7 @@ sub write {
         }
         return 0;
     } elsif ($ref eq 'CODE') {
-        $bref->();
+        $bref->($self);
         return 1;
     } else {
         my $to_write = bytes::length($$bref);
diff --git a/lib/PublicInbox/HTTP.pm b/lib/PublicInbox/HTTP.pm
index c81aeacd..e132c610 100644
--- a/lib/PublicInbox/HTTP.pm
+++ b/lib/PublicInbox/HTTP.pm
@@ -247,7 +247,7 @@ sub response_done_cb ($$) {
         sub {
                 my $env = delete $self->{env};
                 $self->write(\"0\r\n\r\n") if $alive == 2;
-                $self->write(sub{$alive ? next_request($self) : $self->close});
+                $self->write($alive ? \&next_request : \&close);
         }
 }
 
@@ -456,4 +456,11 @@ sub busy () {
         ($self->{rbuf} ne '' || $self->{env} || $self->{wbuf});
 }
 
+# fires after pending writes are complete:
+sub restart_pass ($) {
+        $_[0]->{forward}->restart_read; # see PublicInbox::HTTPD::Async
+}
+
+sub enqueue_restart_pass ($) { $_[0]->write(\&restart_pass) }
+
 1;
diff --git a/lib/PublicInbox/HTTPD/Async.pm b/lib/PublicInbox/HTTPD/Async.pm
index e6df58eb..b46baeb2 100644
--- a/lib/PublicInbox/HTTPD/Async.pm
+++ b/lib/PublicInbox/HTTPD/Async.pm
@@ -34,23 +34,24 @@ sub new {
 
 sub restart_read ($) { $_[0]->watch(PublicInbox::DS::EPOLLIN()) }
 
-# fires after pending writes are complete:
-sub restart_read_cb ($) {
-        my ($self) = @_;
-        sub { restart_read($self) }
-}
-
 sub main_cb ($$$) {
         my ($http, $fh, $bref) = @_;
         sub {
                 my ($self) = @_;
                 my $r = sysread($self->{sock}, $$bref, 8192);
                 if ($r) {
-                        $fh->write($$bref);
+                        $fh->write($$bref); # may call $http->close
+
                         if ($http->{sock}) { # !closed
                                 if ($http->{wbuf}) {
+                                        # HTTP client could not keep up, so
+                                        # stop reading and buffering.
                                         $self->watch(0);
-                                        $http->write(restart_read_cb($self));
+
+                                        # Tell the HTTP socket to restart us
+                                        # when HTTP client is done draining
+                                        # $http->{wbuf}:
+                                        $http->enqueue_restart_pass;
                                 }
                                 # stay in EPOLLIN, but let other clients
                                 # get some work done, too.