]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/HTTP.pm
wwwstream: prioritize search in top title bar
[public-inbox.git] / lib / PublicInbox / HTTP.pm
index 6df1c3fc566aebf1688fd3f1665542297279a684..fa34b443f579b45c37a72b8678e64978062fe6a1 100644 (file)
@@ -25,15 +25,6 @@ use constant {
        CHUNK_MAX_HDR => 256,
 };
 
-# FIXME: duplicated code with NNTP.pm, layering violation
-my $WEAKEN = {}; # string(inbox) -> inbox
-my $weakt;
-sub weaken_task () {
-       $weakt = undef;
-       $_->weaken_all for values %$WEAKEN;
-       $WEAKEN = {};
-}
-
 my $pipelineq = [];
 my $pipet;
 sub process_pipelineq () {
@@ -107,7 +98,7 @@ sub rbuf_process {
        $self->{rbuf} = substr($self->{rbuf}, $r);
 
        my $len = input_prepare($self, \%env);
-       defined $len or return write_err($self); # EMFILE/ENFILE
+       defined $len or return write_err($self, undef); # EMFILE/ENFILE
 
        $len ? event_read_input($self) : app_dispatch($self);
 }
@@ -127,7 +118,7 @@ sub event_read_input ($) {
        while ($len > 0) {
                if ($$rbuf ne '') {
                        my $w = write_in_full($input, $rbuf, $len);
-                       return write_err($self) unless $w;
+                       return write_err($self, $len) unless $w;
                        $len -= $w;
                        die "BUG: $len < 0 (w=$w)" if $len < 0;
                        if ($len == 0) { # next request may be pipelined
@@ -223,7 +214,10 @@ sub chunked_wcb ($) {
                return if $_[0] eq '';
                more($self, sprintf("%x\r\n", bytes::length($_[0])));
                more($self, $_[0]);
-               $self->write("\r\n");
+
+               # use $self->write("\n\n") if you care about real-time
+               # streaming responses, public-inbox WWW does not.
+               more($self, "\r\n");
        }
 }
 
@@ -249,13 +243,6 @@ sub response_done ($$) {
        $self->{env} = undef;
        $self->write("0\r\n\r\n") if $alive == 2;
        $self->write(sub { $alive ? next_request($self) : $self->close });
-
-       # FIXME: layering violation
-       if (my $obj = $env->{'pi-httpd.inbox'}) {
-               # grace period for reaping resources
-               $WEAKEN->{"$obj"} = $obj;
-               PublicInbox::EvCleanup::later(*weaken_task);
-       }
 }
 
 sub getline_response {
@@ -267,14 +254,15 @@ sub getline_response {
                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 ((--$n) <= 0 || $self->{write_buf_size}) {
+                       if ($self->{write_buf_size}) {
                                $self->write($self->{pull});
-                               return;
+                       } else {
+                               PublicInbox::EvCleanup::asap($self->{pull});
                        }
+                       return;
                }
                $self->{forward} = $self->{pull} = undef;
                $forward->close if $forward; # avoid recursion
@@ -344,9 +332,10 @@ sub input_prepare {
 sub env_chunked { ($_[0]->{HTTP_TRANSFER_ENCODING} || '') =~ /\bchunked\b/i }
 
 sub write_err {
-       my ($self) = @_;
+       my ($self, $len) = @_;
        my $err = $self->{httpd}->{env}->{'psgi.errors'};
        my $msg = $! || '(zero write)';
+       $msg .= " ($len bytes remaining)" if defined $len;
        $err->print("error buffering to input: $msg\n");
        quit($self, 500);
 }
@@ -422,7 +411,7 @@ sub event_read_input_chunked { # unlikely...
                until ($len <= 0) {
                        if ($$rbuf ne '') {
                                my $w = write_in_full($input, $rbuf, $len);
-                               return write_err($self) unless $w;
+                               return write_err($self, "$len chunk") if !$w;
                                $len -= $w;
                                if ($len == 0) {
                                        # we may have leftover data to parse