* [PATCH] http: support async_pass for Danga::Socket
@ 2016-05-21 23:45 Eric Wong
2016-05-22 6:17 ` [PATCH 1/2] http: fix typo: write_buf => write_buf_size Eric Wong
0 siblings, 1 reply; 3+ messages in thread
From: Eric Wong @ 2016-05-21 23:45 UTC (permalink / raw)
To: meta
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
^ permalink raw reply related [flat|nested] 3+ messages in thread
end of thread, other threads:[~2016-05-22 6:17 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-05-21 23:45 [PATCH] http: support async_pass for Danga::Socket Eric Wong
2016-05-22 6:17 ` [PATCH 1/2] http: fix typo: write_buf => write_buf_size Eric Wong
2016-05-22 6:17 ` [PATCH 2/2] http: pass reference to Danga::Socket::write Eric Wong
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).