From: Eric Wong Date: Mon, 24 Jun 2019 02:52:13 +0000 (+0000) Subject: ds: share send(..., MSG_MORE) logic X-Git-Tag: v1.2.0~156^2~47 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=e1b203f218b3fedea3068d6265130c47f0af9f4c;p=public-inbox.git ds: share send(..., MSG_MORE) logic No sense in having similar Linux-specific functionality in both our NNTP.pm and HTTP.pm --- diff --git a/lib/PublicInbox/DS.pm b/lib/PublicInbox/DS.pm index ba8bd95f..3e8b0b1a 100644 --- a/lib/PublicInbox/DS.pm +++ b/lib/PublicInbox/DS.pm @@ -21,7 +21,7 @@ use IO::Handle qw(); use Fcntl qw(FD_CLOEXEC F_SETFD F_GETFD); use Time::HiRes qw(clock_gettime CLOCK_MONOTONIC); use parent qw(Exporter); -our @EXPORT_OK = qw(now); +our @EXPORT_OK = qw(now msg_more); use warnings; use PublicInbox::Syscall qw(:epoll); @@ -561,6 +561,25 @@ sub write { } } +use constant MSG_MORE => ($^O eq 'linux') ? 0x8000 : 0; + +sub msg_more ($$) { + my $self = $_[0]; + my $sock = $self->{sock} or return 1; + + if (MSG_MORE && !$self->{wbuf}) { + my $n = send($sock, $_[1], MSG_MORE); + if (defined $n) { + my $nlen = bytes::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])); +} + =head2 C<< $obj->watch_read( $boolean ) >> Turn 'readable' event notification on or off. diff --git a/lib/PublicInbox/HTTP.pm b/lib/PublicInbox/HTTP.pm index 4f1f88fe..a669eb6e 100644 --- a/lib/PublicInbox/HTTP.pm +++ b/lib/PublicInbox/HTTP.pm @@ -19,6 +19,7 @@ use HTTP::Status qw(status_message); use HTTP::Date qw(time2str); use IO::Handle; require PublicInbox::EvCleanup; +PublicInbox::DS->import('msg_more'); use constant { CHUNK_START => -1, # [a-f0-9]+\r\n CHUNK_END => -2, # \r\n @@ -207,7 +208,7 @@ sub response_header_write { $h .= 'Date: ' . http_date() . "\r\n\r\n"; if (($len || $chunked) && $env->{REQUEST_METHOD} ne 'HEAD') { - more($self, $h); + msg_more($self, $h); } else { $self->write(\$h); } @@ -219,12 +220,12 @@ sub chunked_wcb ($) { my ($self) = @_; sub { return if $_[0] eq ''; - more($self, sprintf("%x\r\n", bytes::length($_[0]))); - more($self, $_[0]); + msg_more($self, sprintf("%x\r\n", bytes::length($_[0]))); + msg_more($self, $_[0]); # use $self->write(\"\n\n") if you care about real-time # streaming responses, public-inbox WWW does not. - more($self, "\r\n"); + msg_more($self, "\r\n"); } } @@ -316,23 +317,6 @@ sub response_write { } } -use constant MSG_MORE => ($^O eq 'linux') ? 0x8000 : 0; -sub more ($$) { - my $self = $_[0]; - return unless $self->{sock}; - if (MSG_MORE && !$self->{wbuf}) { - my $n = send($self->{sock}, $_[1], MSG_MORE); - if (defined $n) { - 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])); -} - sub input_prepare { my ($self, $env) = @_; my $input; diff --git a/lib/PublicInbox/NNTP.pm b/lib/PublicInbox/NNTP.pm index d9097cc7..fe01627f 100644 --- a/lib/PublicInbox/NNTP.pm +++ b/lib/PublicInbox/NNTP.pm @@ -14,7 +14,7 @@ use PublicInbox::Git; require PublicInbox::EvCleanup; use Email::Simple; use POSIX qw(strftime); -PublicInbox::DS->import('now'); +PublicInbox::DS->import(qw(now msg_more)); use Digest::SHA qw(sha1_hex); use Time::Local qw(timegm timelocal); use constant { @@ -159,12 +159,12 @@ sub cmd_xgtitle ($;$) { sub list_overview_fmt ($) { my ($self) = @_; - do_more($self, $OVERVIEW_FMT); + msg_more($self, $OVERVIEW_FMT); } sub list_headers ($;$) { my ($self) = @_; - do_more($self, $LIST_HEADERS); + msg_more($self, $LIST_HEADERS); } sub list_active ($;$) { @@ -519,8 +519,8 @@ sub simple_body_write ($$) { $s->body_set(''); $body =~ s/^\./../smg; $body =~ s/(? article retrieved - head and body follow"); - do_more($self, _header($s)); - do_more($self, "\r\n"); + msg_more($self, _header($s)); + msg_more($self, "\r\n"); simple_body_write($self, $s); } @@ -562,7 +562,7 @@ sub cmd_head ($;$) { my ($n, $mid, $s) = @$r; set_art($self, $art); more($self, "221 $n <$mid> article retrieved - head follows"); - do_more($self, _header($s)); + msg_more($self, _header($s)); '.' } @@ -762,7 +762,7 @@ sub hdr_searchmsg ($$$$) { $tmp .= $s->{num} . ' ' . $s->$field . "\r\n"; } utf8::encode($tmp); - do_more($self, $tmp); + msg_more($self, $tmp); $cur = $msgs->[-1]->{num} + 1; }); } @@ -914,19 +914,13 @@ sub cmd_xpath ($$) { '223 '.join(' ', @paths); } -sub res ($$) { - my ($self, $line) = @_; - do_write($self, $line . "\r\n"); -} +sub res ($$) { do_write($_[0], $_[1] . "\r\n") } -sub more ($$) { - my ($self, $line) = @_; - do_more($self, $line . "\r\n"); -} +sub more ($$) { msg_more($_[0], $_[1] . "\r\n") } sub do_write ($$) { - my ($self, $data) = @_; - my $done = $self->write($data); + my $self = $_[0]; + my $done = $self->write(\($_[1])); return 0 unless $self->{sock}; # Do not watch for readability if we have data in the queue, @@ -946,21 +940,6 @@ sub out ($$;@) { printf { $self->{nntpd}->{out} } $fmt."\n", @args; } -use constant MSG_MORE => ($^O eq 'linux') ? 0x8000 : 0; - -sub do_more ($$) { - my ($self, $data) = @_; - if (MSG_MORE && !$self->{wbuf}) { - my $n = send($self->{sock}, $data, MSG_MORE); - if (defined $n) { - my $dlen = length($data); - return 1 if $n == $dlen; # all done! - $data = substr($data, $n, $dlen - $n); - } - } - do_write($self, $data); -} - sub event_step { my ($self) = @_;