]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/ViewVCS.pm
viewvcs: avoid anonymous sub for HTML response
[public-inbox.git] / lib / PublicInbox / ViewVCS.pm
index 886e10cb6874432e613adf2e02b8432a05409f1d..a6dbb9a9080eba3fd197d10599c74287f302241a 100644 (file)
@@ -31,46 +31,53 @@ my %QP_MAP = ( A => 'oid_a', B => 'oid_b', a => 'path_a', b => 'path_b' );
 our $MAX_SIZE = 1024 * 1024; # TODO: configurable
 my $BIN_DETECT = 8000; # same as git
 
+sub html_i { # WwwStream::getline callback
+       my ($nr, $ctx) =  @_;
+       $nr == 1 ? ${delete $ctx->{rv}} : undef;
+}
+
 sub html_page ($$$) {
        my ($ctx, $code, $strref) = @_;
        my $wcb = delete $ctx->{-wcb};
        $ctx->{-upfx} = '../../'; # from "/$INBOX/$OID/s/"
-       my $res = PublicInbox::WwwStream->response($ctx, $code, sub {
-               my ($nr, undef) =  @_;
-               $nr == 1 ? $$strref : undef;
-       });
+       $ctx->{rv} = $strref;
+       my $res = PublicInbox::WwwStream->response($ctx, $code, \&html_i);
        $wcb ? $wcb->($res) : $res;
 }
 
+sub stream_blob_parse_hdr { # {parse_hdr} for Qspawn
+       my ($r, $bref, $ctx) = @_;
+       my ($res, $logref) = delete @$ctx{qw(-res -logref)};
+       my ($git, $oid, $type, $size, $di) = @$res;
+       my @cl = ('Content-Length', $size);
+       if (!defined $r) { # error
+               html_page($ctx, 500, $logref);
+       } elsif (index($$bref, "\0") >= 0) {
+               [200, [qw(Content-Type application/octet-stream), @cl] ];
+       } else {
+               my $n = bytes::length($$bref);
+               if ($n >= $BIN_DETECT || $n == $size) {
+                       return [200, [ 'Content-Type',
+                               'text/plain; charset=UTF-8', @cl ] ];
+               }
+               if ($r == 0) {
+                       warn "premature EOF on $oid $$logref\n";
+                       return html_page($ctx, 500, $logref);
+               }
+               undef; # bref keeps growing
+       }
+}
+
 sub stream_large_blob ($$$$) {
        my ($ctx, $res, $logref, $fn) = @_;
+       $ctx->{-logref} = $logref;
+       $ctx->{-res} = $res;
        my ($git, $oid, $type, $size, $di) = @$res;
        my $cmd = ['git', "--git-dir=$git->{git_dir}", 'cat-file', $type, $oid];
        my $qsp = PublicInbox::Qspawn->new($cmd);
-       my @cl = ('Content-Length', $size);
        my $env = $ctx->{env};
-       $env->{'public-inbox.tmpgit'} = $git; # for {-tmp}/File::Temp::Dir
        $env->{'qspawn.wcb'} = delete $ctx->{-wcb};
-       $qsp->psgi_return($env, undef, sub {
-               my ($r, $bref) = @_;
-               if (!defined $r) { # error
-                       html_page($ctx, 500, $logref);
-               } elsif (index($$bref, "\0") >= 0) {
-                       my $ct = 'application/octet-stream';
-                       [200, ['Content-Type', $ct, @cl ] ];
-               } else {
-                       my $n = bytes::length($$bref);
-                       if ($n >= $BIN_DETECT || $n == $size) {
-                               my $ct = 'text/plain; charset=UTF-8';
-                               return [200, ['Content-Type', $ct, @cl] ];
-                       }
-                       if ($r == 0) {
-                               warn "premature EOF on $oid $$logref\n";
-                               return html_page($ctx, 500, $logref);
-                       }
-                       undef; # bref keeps growing
-               }
-       });
+       $qsp->psgi_return($env, undef, \&stream_blob_parse_hdr, $ctx);
 }
 
 sub show_other_result ($$) {