about summary refs log tree commit homepage
path: root/lib
diff options
context:
space:
mode:
authorEric Wong <e@yhbt.net>2020-01-24 09:43:49 +0000
committerEric Wong <e@yhbt.net>2020-01-25 19:20:37 +0000
commit13aee729fa6d49ffb8583af8f780e836f8f7d503 (patch)
treefdacb61ff853173554c656dc8a26960ed5b1cd9b /lib
parent021b862ac94f1c226f0778a336d4f3d566b86f9b (diff)
downloadpublic-inbox-13aee729fa6d49ffb8583af8f780e836f8f7d503.tar.gz
While there is no known actual leak due to reference cycles,
here, eliminating a potential source of leaks is helpful.
Diffstat (limited to 'lib')
-rw-r--r--lib/PublicInbox/HTTP.pm7
1 files changed, 3 insertions, 4 deletions
diff --git a/lib/PublicInbox/HTTP.pm b/lib/PublicInbox/HTTP.pm
index 32537153..b19a15d6 100644
--- a/lib/PublicInbox/HTTP.pm
+++ b/lib/PublicInbox/HTTP.pm
@@ -80,7 +80,7 @@ sub event_step { # called by PublicInbox::DS
         # only read more requests if we've drained the write buffer,
         # otherwise we can be buffering infinitely w/o backpressure
 
-        return read_input($self) if defined $self->{env};
+        return read_input($self) if ref($self->{env});
         my $rbuf = $self->{rbuf} // (\(my $x = ''));
         $self->do_read($rbuf, 8192, bytes::length($$rbuf)) or return;
         rbuf_process($self, $rbuf);
@@ -124,7 +124,6 @@ sub read_input ($;$) {
         my ($self, $rbuf) = @_;
         $rbuf //= $self->{rbuf} // (\(my $x = ''));
         my $env = $self->{env};
-        return if $env->{REMOTE_ADDR}; # in app dispatch
         return read_input_chunked($self, $rbuf) if env_chunked($env);
 
         # env->{CONTENT_LENGTH} (identity)
@@ -153,6 +152,7 @@ sub app_dispatch {
         my ($self, $input, $rbuf) = @_;
         $self->rbuf_idle($rbuf);
         my $env = $self->{env};
+        $self->{env} = undef; # for exists() check in ->busy
         $env->{REMOTE_ADDR} = $self->{remote_addr};
         $env->{REMOTE_PORT} = $self->{remote_port};
         if (defined(my $host = $env->{HTTP_HOST})) {
@@ -455,7 +455,6 @@ sub quit {
 
 sub close {
         my $self = $_[0];
-        delete $self->{env}; # prevent circular references
         if (my $forward = delete $self->{forward}) {
                 eval { $forward->close };
                 err($self, "forward ->close error: $@") if $@;
@@ -466,7 +465,7 @@ sub close {
 # for graceful shutdown in PublicInbox::Daemon:
 sub busy () {
         my ($self) = @_;
-        ($self->{rbuf} || $self->{env} || $self->{wbuf});
+        ($self->{rbuf} || exists($self->{env}) || $self->{wbuf});
 }
 
 # Chunked and Identity packages are used for writing responses.