]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/WwwStream.pm
imap+nntp: share COMPRESS implementation
[public-inbox.git] / lib / PublicInbox / WwwStream.pm
index 472316c29c4ca12531b4b059ac8c9751772322cc..aee78170c713df91ea1186264080fb32a7e2dbfa 100644 (file)
@@ -32,7 +32,7 @@ sub init {
 
 sub async_eml { # for async_blob_cb
        my ($ctx, $eml) = @_;
-       $ctx->{http_out}->write($ctx->translate($ctx->{cb}->($ctx, $eml)));
+       $ctx->write($ctx->{cb}->($ctx, $eml));
 }
 
 sub html_top ($) {
@@ -89,7 +89,7 @@ sub coderepos ($) {
        my @ret;
        for my $cr_name (@$cr) {
                $ret[0] //= <<EOF;
-<a id=code>code repositories for project(s) associated with this inbox:
+<a id=code>Code repositories for project(s) associated with this inbox:
 EOF
                my $urls = $cfg->get_all("coderepo.$cr_name.cgiturl");
                if ($urls) {
@@ -109,10 +109,42 @@ EOF
 
 sub _html_end {
        my ($ctx) = @_;
-       my @cr = coderepos($ctx);
-       scalar(@cr) ?
-               '<hr><pre>'.join("\n\n", @cr).'</pre></body></html>' :
-               '</body></html>';
+       my $upfx = $ctx->{-upfx} || '';
+       my $m = "${upfx}_/text/mirror/";
+       my $x;
+       if ($ctx->{ibx}->can('cloneurl')) {
+               $x = <<EOF;
+This is a public inbox, see <a
+href="$m">mirroring instructions</a>
+for how to clone and mirror all data and code used for this inbox
+EOF
+               my $has_nntp = @{$ctx->{ibx}->nntp_url($ctx)};
+               my $has_imap = @{$ctx->{ibx}->imap_url($ctx)};
+               if ($has_nntp || $has_imap) {
+                       substr($x, -1, 1) = ";\n"; # s/\n/;\n
+                       if ($has_nntp && $has_imap) {
+                               $x .= <<EOM;
+as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).
+EOM
+                       } elsif ($has_nntp) {
+                               $x .= <<EOM;
+as well as URLs for NNTP newsgroup(s).
+EOM
+                       } else {
+                               $x .= <<EOM;
+as well as URLs for IMAP folder(s).
+EOM
+                       }
+               }
+       } else {
+               $x = <<EOF;
+This is an external index of several public inboxes,
+see <a href="$m">mirroring instructions</a> on how to clone and mirror
+all data and code used by this external index.
+EOF
+       }
+       chomp $x;
+       '<hr><pre>'.join("\n\n", coderepos($ctx), $x).'</pre></body></html>'
 }
 
 # callback for HTTP.pm (and any other PSGI servers)
@@ -138,9 +170,9 @@ sub html_oneshot ($$;$) {
                'Content-Length' => undef ];
        bless $ctx, __PACKAGE__;
        $ctx->{gz} = PublicInbox::GzipFilter::gz_or_noop($res_hdr, $ctx->{env});
-       $ctx->{base_url} //= do {
+       $ctx->{base_url} // do {
                $ctx->zmore(html_top($ctx));
-               base_url($ctx);
+               $ctx->{base_url} = base_url($ctx);
        };
        $ctx->zmore($$sref) if $sref;
        my $bdy = $ctx->zflush(_html_end($ctx));
@@ -155,8 +187,7 @@ sub async_next ($) {
                if (my $smsg = $ctx->{smsg} = $ctx->{cb}->($ctx)) {
                        $ctx->smsg_blob($smsg);
                } else {
-                       $ctx->{http_out}->write(
-                                       $ctx->translate(_html_end($ctx)));
+                       $ctx->write(_html_end($ctx));
                        $ctx->close; # GzipFilter->close
                }
        };