diff options
Diffstat (limited to 'lib/PublicInbox/Qspawn.pm')
-rw-r--r-- | lib/PublicInbox/Qspawn.pm | 16 |
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'}; |