about summary refs log tree commit homepage
path: root/lib
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2017-01-04 11:20:51 +0000
committerEric Wong <e@80x24.org>2017-01-04 16:12:08 +0000
commitf62f27ddd89720215e929af4ead2f97b750664b6 (patch)
tree556cc049674187f15a9af15d9aa856eabf524222 /lib
parent950be11b15dcd1edee98caec80b445471971a55f (diff)
downloadpublic-inbox-f62f27ddd89720215e929af4ead2f97b750664b6.tar.gz
Avoiding weaken here is no more dangerous than the existing
circular refs (e.g. psgix.io) we create and manage throughout
the lifetime of the connection.  So, trust ourselves to maintain
the data structure properly and avoid triggering extra memory
usage.

While we're at it, avoid having anonymous subroutines capture
more variables than necessary to simplify reference auditing.
Diffstat (limited to 'lib')
-rw-r--r--lib/PublicInbox/HTTP.pm25
1 files changed, 12 insertions, 13 deletions
diff --git a/lib/PublicInbox/HTTP.pm b/lib/PublicInbox/HTTP.pm
index 03ce4fe5..3530f8ba 100644
--- a/lib/PublicInbox/HTTP.pm
+++ b/lib/PublicInbox/HTTP.pm
@@ -16,7 +16,6 @@ use Fcntl qw(:seek);
 use Plack::HTTPParser qw(parse_http_request); # XS or pure Perl
 use HTTP::Status qw(status_message);
 use HTTP::Date qw(time2str);
-use Scalar::Util qw(weaken);
 use IO::Handle;
 use constant {
         CHUNK_START => -1,   # [a-f0-9]+\r\n
@@ -237,12 +236,14 @@ sub next_request ($) {
         }
 }
 
-sub response_done ($$) {
+sub response_done_cb ($$) {
         my ($self, $alive) = @_;
-        my $env = $self->{env};
-        $self->{env} = undef;
-        $self->write("0\r\n\r\n") if $alive == 2;
-        $self->write(sub { $alive ? next_request($self) : $self->close });
+        sub {
+                my $env = $self->{env};
+                $self->{env} = undef;
+                $self->write("0\r\n\r\n") if $alive == 2;
+                $self->write(sub{$alive ? next_request($self) : $self->close});
+        }
 }
 
 sub getline_cb ($$$) {
@@ -283,10 +284,8 @@ sub getline_cb ($$$) {
         $close->();
 }
 
-sub getline_response {
-        my ($self, $body, $write, $close) = @_;
-        $self->{forward} = $body;
-        weaken($self);
+sub getline_response ($$$) {
+        my ($self, $write, $close) = @_;
         my $pull = $self->{pull} = sub { getline_cb($self, $write, $close) };
         $pull->();
 }
@@ -294,15 +293,15 @@ sub getline_response {
 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);
-        my $close = sub { response_done($self, $alive) };
         if (defined(my $body = $res->[2])) {
                 if (ref $body eq 'ARRAY') {
                         $write->($_) foreach @$body;
                         $close->();
                 } else {
-                        getline_response($self, $body, $write, $close);
+                        $self->{forward} = $body;
+                        getline_response($self, $write, $close);
                 }
         } else {
                 # this is returned to the calling application: