From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.5 required=3.0 tests=ALL_TRUSTED,AWL,BAYES_00, URIBL_BLOCKED shortcircuit=no autolearn=unavailable autolearn_force=no version=3.4.0 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id C733D1F99C for ; Sat, 21 May 2016 23:45:27 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH] http: support async_pass for Danga::Socket Date: Sat, 21 May 2016 23:45:27 +0000 Message-Id: <20160521234527.21133-1-e@80x24.org> List-Id: This will allow us to minimize buffering after we wait (possibly a long time) for readability. This also greatly reduces the amount of Danga::Socket-specific knowledge we have in our PSGI code, making it easier for others to understand. --- lib/PublicInbox/HTTP.pm | 18 ++++++++++++++++++ lib/PublicInbox/HTTPD/Async.pm | 2 ++ 2 files changed, 20 insertions(+) diff --git a/lib/PublicInbox/HTTP.pm b/lib/PublicInbox/HTTP.pm index f69056f..d523bd4 100644 --- a/lib/PublicInbox/HTTP.pm +++ b/lib/PublicInbox/HTTP.pm @@ -219,6 +219,24 @@ sub response_write { if (ref $body eq 'ARRAY') { $write->($_) foreach @$body; $close->(); + } elsif ($body->can('async_pass')) { # HTTPD::Async + # prevent us from reading the body faster than we + # can write to the client + my $restart_read = sub { $body->watch_read(1) }; + $body->async_pass(sub { + local $/ = \8192; + my $buf = $body->getline; + if (defined $buf) { + $write->($buf); + if ($self->{write_buf}) { + $body->watch_read(0); + $self->write($restart_read); + } + return; # continue waiting + } + $body->close; + $close->(); + }); } else { my $pull; $pull = sub { diff --git a/lib/PublicInbox/HTTPD/Async.pm b/lib/PublicInbox/HTTPD/Async.pm index bedb397..ceba738 100644 --- a/lib/PublicInbox/HTTPD/Async.pm +++ b/lib/PublicInbox/HTTPD/Async.pm @@ -21,10 +21,12 @@ sub new { $self; } +sub async_pass { $_[0]->{cb} = $_[1] } sub event_read { $_[0]->{cb}->() } sub event_hup { $_[0]->{cb}->() } sub event_err { $_[0]->{cb}->() } sub sysread { shift->{sock}->sysread(@_) } +sub getline { $_[0]->{sock}->getline }; sub close { my $self = shift; -- 2.8.0.rc2.38.gfdf5e7f