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 () {
$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);
}
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
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");
}
}
$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 {
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)\n" if defined $len;
$err->print("error buffering to input: $msg\n");
quit($self, 500);
}
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