+ if (delete $self->{forward}) {
+ eval { $forward->close };
+ if ($@) {
+ err($self, "response ->close error: $@");
+ $self->close; # idempotent
+ }
+ }
+ $forward = undef;
+ $close->(); # call response_done_cb
+ };
+
+ $pull->(); # kick-off!
+}
+
+sub response_write {
+ my ($self, $env, $res) = @_;
+ my $alive = response_header_write($self, $env, $res);
+ my $close = response_done_cb($self, $alive);
+ my $write = $alive == 2 ? chunked_wcb($self) : identity_wcb($self);
+ if (defined(my $body = $res->[2])) {
+ if (ref $body eq 'ARRAY') {
+ $write->($_) foreach @$body;
+ $close->();
+ } else {
+ $self->{forward} = $body;
+ getline_response($self, $write, $close);
+ }
+ } else {
+ # this is returned to the calling application:
+ Plack::Util::inline_object(write => $write, close => $close);