about summary refs log tree commit homepage
path: root/lib/PublicInbox/Qspawn.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/PublicInbox/Qspawn.pm')
-rw-r--r--lib/PublicInbox/Qspawn.pm16
1 files changed, 13 insertions, 3 deletions
diff --git a/lib/PublicInbox/Qspawn.pm b/lib/PublicInbox/Qspawn.pm
index 8f0b9fe2..fb48585c 100644
--- a/lib/PublicInbox/Qspawn.pm
+++ b/lib/PublicInbox/Qspawn.pm
@@ -195,9 +195,19 @@ sub psgi_return {
 
         my $buf = '';
         my $rd_hdr = sub {
-                my $r = sysread($rpipe, $buf, 1024, length($buf));
-                return if !defined($r) && $! == EAGAIN || $! == EINTR;
-                $parse_hdr->($r, \$buf);
+                # we must loop until EAGAIN for EPOLLET in HTTPD/Async.pm
+                # We also need to check EINTR for generic PSGI servers.
+                my $ret;
+                my $n = 0;
+                do {
+                        my $r = sysread($rpipe, $buf, 4096, length($buf));
+                        return if !defined($r) && $! == EAGAIN || $! == EINTR;
+
+                        # $r may be undef, here:
+                        $n += $r if $r;
+                        $ret = $parse_hdr->($r ? $n : $r, \$buf);
+                } until (defined $ret);
+                $ret;
         };
 
         my $wcb = delete $env->{'qspawn.wcb'};