]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/Qspawn.pm
qspawn: fix EINTR with generic PSGI servers
[public-inbox.git] / lib / PublicInbox / Qspawn.pm
index 7984e35a80510ffdf09cbb7f5e325ecd9eb764a0..f2beb4b21febc96f8a22862f835a3ffc1244e405 100644 (file)
@@ -201,7 +201,7 @@ sub rd_hdr ($) {
        my $total_rd = 0;
        my $hdr_buf = $self->{hdr_buf};
        my ($ph_cb, $ph_arg) = @{$self->{parse_hdr}};
-       do {
+       until (defined($ret)) {
                my $r = sysread($self->{rpipe}, $$hdr_buf, 4096,
                                length($$hdr_buf));
                if (defined($r)) {
@@ -210,6 +210,13 @@ sub rd_hdr ($) {
                        if ($@) {
                                warn "parse_hdr: $@";
                                $ret = [ 500, [], [ "Internal error\n" ] ];
+                       } elsif (!defined($ret) && !$r) {
+                               my $cmd = $self->{cmd} // [ '(?)' ];
+                               my $env = $self->{psgi_env};
+                               warn <<EOM;
+EOF parsing headers from @$cmd ($self->{psgi_env}->{REQUEST_URI})
+EOM
+                               $ret = [ 500, [], [ "Internal error\n" ] ];
                        }
                } else {
                        # caller should notify us when it's ready:
@@ -218,7 +225,7 @@ sub rd_hdr ($) {
                        warn "error reading header: $!";
                        $ret = [ 500, [], [ "Internal error\n" ] ];
                }
-       } until (defined $ret);
+       }
        delete $self->{parse_hdr}; # done parsing headers
        $ret;
 }