- while ($forward && defined(my $buf = $forward->getline)) {
- $write->($buf);
- last if $self->{closed};
- if ($self->{write_buf_size}) {
- $self->write($self->{pull});
- } else {
- PublicInbox::EvCleanup::asap($self->{pull});
+ my $buf = eval {
+ local $/ = \8192;
+ $forward->getline;
+ } if $forward;
+
+ if (defined $buf) {
+ $write->($buf); # may close in PublicInbox::DS::write
+
+ if ($self->{sock}) {
+ my $wbuf = $self->{wbuf} ||= [];
+ push @$wbuf, $pull;
+
+ # wbuf may be populated by $write->($buf),
+ # no need to rearm if so:
+ $self->requeue if scalar(@$wbuf) == 1;
+ return; # likely
+ }
+ } elsif ($@) {
+ err($self, "response ->getline error: $@");
+ $self->close;
+ }
+
+ $pull = undef; # all done!
+ # avoid recursion
+ if (delete $self->{forward}) {
+ eval { $forward->close };
+ if ($@) {
+ err($self, "response ->close error: $@");
+ $self->close; # idempotent