From 6b5e35ca6dc6a505d26f129627b5eb7ff8476539 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sun, 22 May 2016 00:33:59 +0000 Subject: http: async getline supports push_back_read Sometimes we need to read something to ensure it's a successful response. --- lib/PublicInbox/HTTPD/Async.pm | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/PublicInbox/HTTPD/Async.pm b/lib/PublicInbox/HTTPD/Async.pm index ceba738e..8f3a6a09 100644 --- a/lib/PublicInbox/HTTPD/Async.pm +++ b/lib/PublicInbox/HTTPD/Async.pm @@ -26,7 +26,23 @@ 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 getline { + my ($self) = @_; + die 'getline called without $/ ref' unless ref $/; + while (1) { + my $ret = $self->read(8192); # Danga::Socket::read + return $$ret if defined $ret; + + return unless $!{EAGAIN} || $!{EINTR}; + + # in case of spurious wakeup, hopefully we never hit this + my $vin = ''; + vec($vin, $self->{fd}, 1) = 1; + my $n; + do { $n = select($vin, undef, undef, undef) } until $n; + } +} sub close { my $self = shift; -- cgit v1.2.3-24-ge0c7