]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/HTTP.pm
http: support graceful shutdown like nntp
[public-inbox.git] / lib / PublicInbox / HTTP.pm
index f65dedaae2c5a64e3935b7ef0304b4560387a7b4..928c0f22469ca8bd73b74646b3d40d789ad587bf 100644 (file)
@@ -40,7 +40,7 @@ sub event_read { # called by Danga::Socket
 
        return event_read_input($self) if defined $self->{env};
 
-       my $off = $self->{rbuf} eq '' ? 0 : length($self->{rbuf});
+       my $off = length($self->{rbuf});
        my $r = sysread($self->{sock}, $self->{rbuf}, 8192, $off);
        if (defined $r) {
                return $self->close if $r == 0;
@@ -103,7 +103,6 @@ sub app_dispatch ($) {
        my ($self) = @_;
        $self->watch_read(0);
        my $env = $self->{env};
-       $self->{env} = undef;
        $env->{REMOTE_ADDR} = $self->peer_ip_string; # Danga::Socket
        $env->{REMOTE_PORT} = $self->{peer_port}; # set by peer_ip_string
        if (my $host = $env->{HTTP_HOST}) {
@@ -169,6 +168,7 @@ sub response_write {
                } else {
                        $self->write(sub { $self->close });
                }
+               $self->{env} = undef;
        };
 
        if (defined $res->[2]) {
@@ -336,4 +336,10 @@ sub quit {
 sub event_hup { $_[0]->close }
 sub event_err { $_[0]->close }
 
+# for graceful shutdown in PublicInbox::Daemon:
+sub busy () {
+       my ($self) = @_;
+       ($self->{rbuf} ne '' || $self->{env} || $self->{write_buf_size});
+}
+
 1;