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=-5.4 required=3.0 tests=ALL_TRUSTED,AWL,BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,RP_MATCHES_RCVD,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 3191A1FCC0 for ; Sun, 22 May 2016 20:57:36 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 3/5] git-http-backend: simplify dumb serving Date: Sun, 22 May 2016 20:57:32 +0000 Message-Id: <20160522205734.12316-4-e@80x24.org> In-Reply-To: <20160522205734.12316-1-e@80x24.org> References: <20160522205734.12316-1-e@80x24.org> List-Id: We can rely entirely on getline + close callbacks and be compatible with 100% of PSGI servers. --- lib/PublicInbox/GitHTTPBackend.pm | 66 +++++++++++---------------------------- 1 file changed, 19 insertions(+), 47 deletions(-) diff --git a/lib/PublicInbox/GitHTTPBackend.pm b/lib/PublicInbox/GitHTTPBackend.pm index 35c3383..97d96d5 100644 --- a/lib/PublicInbox/GitHTTPBackend.pm +++ b/lib/PublicInbox/GitHTTPBackend.pm @@ -92,43 +92,9 @@ sub serve_dumb { # TODO: If-Modified-Since and Last-Modified? open my $in, '<', $f or return r(404); my $len = $size; - my $n = 65536; # try to negotiate a big TCP window, first - my ($next, $fh); - my $cb = sub { - $n = $len if $len < $n; - my $r = sysread($in, my $buf, $n); - if (!defined $r) { - err($env, "$f read error: $!"); - drop_client($env); - } elsif ($r <= 0) { - err($env, "$f EOF with $len bytes left"); - drop_client($env); - } else { - $len -= $r; - $fh->write($buf); - if ($len == 0) { - $fh->close; - } elsif ($next) { - # avoid recursion in Danga::Socket::write - unless ($nextq) { - $nextq = []; - Danga::Socket->AddTimer(0, *do_next); - } - # avoid buffering too much in case we have - # slow clients: - $n = 8192; - push @$nextq, $next; - return; - } - } - # all done, cleanup references: - $fh = $next = undef; - }; - my $code = 200; push @h, 'Content-Type', $type; - my $range = $env->{HTTP_RANGE}; - if (defined $range && $range =~ /\bbytes=(\d*)-(\d*)\z/) { + if (($env->{HTTP_RANGE} || '') =~ /\bbytes=(\d*)-(\d*)\z/) { ($code, $len) = prepare_range($cgi, $in, \@h, $1, $2, $size); if ($code == 416) { push @h, 'Content-Range', "bytes */$size"; @@ -136,18 +102,24 @@ sub serve_dumb { } } push @h, 'Content-Length', $len; - - sub { - my ($res) = @_; # Plack callback - $fh = $res->([ $code, \@h ]); - if (defined $env->{'pi-httpd.async'}) { - my $pi_http = $env->{'psgix.io'}; - $next = sub { $pi_http->write($cb) }; - $cb->(); # start it off! - } else { - $cb->() while $fh; - } - } + my $n = 65536; + [ $code, \@h, Plack::Util::inline_object(close => sub { close $in }, + getline => sub { + return if $len == 0; + $n = $len if $len < $n; + my $r = sysread($in, my $buf, $n); + if (!defined $r) { + err($env, "$f read error: $!"); + } elsif ($r <= 0) { + err($env, "$f EOF with $len bytes left"); + } else { + $len -= $r; + $n = 8192; + return $buf; + } + drop_client($env); + return; + })] } sub prepare_range {