]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/HTTP.pm
bundle Danga::Socket and Sys::Syscall
[public-inbox.git] / lib / PublicInbox / HTTP.pm
index 3dd49be30ca7dc1330491b5b875e37384fdf7181..11bd241e91a1661d316a7f3d037f047b938762df 100644 (file)
@@ -10,8 +10,9 @@
 package PublicInbox::HTTP;
 use strict;
 use warnings;
-use base qw(Danga::Socket);
+use base qw(PublicInbox::DS);
 use fields qw(httpd env rbuf input_left remote_addr remote_port forward pull);
+use bytes (); # only for bytes::length
 use Fcntl qw(:seek);
 use Plack::HTTPParser qw(parse_http_request); # XS or pure Perl
 use HTTP::Status qw(status_message);
@@ -62,7 +63,7 @@ sub new ($$$) {
        $self;
 }
 
-sub event_read { # called by Danga::Socket
+sub event_read { # called by PublicInbox::DS
        my ($self) = @_;
 
        return event_read_input($self) if defined $self->{env};
@@ -147,7 +148,7 @@ sub app_dispatch {
                sysseek($input, 0, SEEK_SET) or
                        die "BUG: psgi.input seek failed: $!";
        }
-       # note: NOT $self->{sock}, we want our close (+ Danga::Socket::close),
+       # note: NOT $self->{sock}, we want our close (+ PublicInbox::DS::close),
        # to do proper cleanup:
        $env->{'psgix.io'} = $self; # only for ->close
        my $res = Plack::Util::run_app($self->{httpd}->{app}, $env);
@@ -255,7 +256,7 @@ sub getline_cb ($$$) {
        if ($forward) {
                my $buf = eval { $forward->getline };
                if (defined $buf) {
-                       $write->($buf); # may close in Danga::Socket::write
+                       $write->($buf); # may close in PublicInbox::DS::write
                        unless ($self->{closed}) {
                                my $next = $self->{pull};
                                if ($self->{write_buf_size}) {
@@ -316,10 +317,11 @@ sub more ($$) {
        if (MSG_MORE && !$self->{write_buf_size}) {
                my $n = send($self->{sock}, $_[1], MSG_MORE);
                if (defined $n) {
-                       my $dlen = length($_[1]);
-                       return 1 if $n == $dlen; # all done!
-                       $_[1] = substr($_[1], $n, $dlen - $n);
-                       # fall through to normal write:
+                       my $nlen = length($_[1]) - $n;
+                       return 1 if $nlen == 0; # all done!
+
+                       # PublicInbox::DS::write queues the unwritten substring:
+                       return $self->write(substr($_[1], $n, $nlen));
                }
        }
        $self->write($_[1]);
@@ -463,7 +465,7 @@ sub quit {
        $self->close;
 }
 
-# callbacks for Danga::Socket
+# callbacks for PublicInbox::DS
 
 sub event_hup { $_[0]->close }
 sub event_err { $_[0]->close }