# Copyright (C) 2016-2020 all contributors <meta@public-inbox.org>
# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
#
-# HTML body stream for which yields getline+close methods
+# HTML body stream for which yields getline+close methods for
+# generic PSGI servers and callbacks for public-inbox-httpd.
#
-# public-inbox-httpd favors "getline" response bodies to take a
-# "pull"-based approach to feeding slow clients (as opposed to a
-# more common "push" model)
+# See PublicInbox::GzipFilter parent class for more info.
package PublicInbox::WwwStream;
use strict;
use parent qw(Exporter PublicInbox::GzipFilter);
our @EXPORT_OK = qw(html_oneshot);
use bytes (); # length
-use PublicInbox::Hval qw(ascii_html prurl);
+use PublicInbox::Hval qw(ascii_html prurl ts2str);
our $TOR_URL = 'https://www.torproject.org/';
our $CODE_URL = 'https://public-inbox.org/public-inbox.git';
bless $ctx, __PACKAGE__;
}
-sub response {
- my ($ctx, $code, $cb) = @_;
- my $res_hdr = [ 'Content-Type' => 'text/html; charset=UTF-8' ];
- init($ctx, $cb);
- $ctx->{gz} = PublicInbox::GzipFilter::gz_or_noop($res_hdr, $ctx->{env});
- [ $code, $res_hdr, $ctx ]
-}
-
-sub async_eml { # ->{async_eml} for async_blob_cb
+sub async_eml { # for async_blob_cb
my ($ctx, $eml) = @_;
$ctx->{http_out}->write($ctx->translate($ctx->{cb}->($ctx, $eml)));
}
my $color = $upfx.'_/text/color';
my $atom = $ctx->{-atom} || $upfx.'new.atom';
my $top = "<b>$desc</b>";
+ if (my $t_max = $ctx->{-t_max}) {
+ $t_max = ts2str($t_max);
+ $top = qq(<a\nhref="$upfx?t=$t_max">$top</a>);
+ # we had some kind of query, link to /$INBOX/?t=YYYYMMDDhhmmss
+ } elsif ($ctx->{qp}->{t}) {
+ $top = qq(<a\nhref="./">$top</a>);
+ }
my $links = "<a\nhref=\"$help\">help</a> / ".
"<a\nhref=\"$color\">color</a> / ".
"<a\nhref=\"$atom\">Atom feed</a>";
sub html_oneshot ($$;$) {
my ($ctx, $code, $sref) = @_;
- $ctx->{base_url} = base_url($ctx);
- bless $ctx, __PACKAGE__;
- my @bdy;
my $res_hdr = [ 'Content-Type' => 'text/html; charset=UTF-8',
'Content-Length' => undef ];
+ bless $ctx, __PACKAGE__;
$ctx->{gz} = PublicInbox::GzipFilter::gz_or_noop($res_hdr, $ctx->{env});
- $ctx->zmore(html_top($ctx));
+ $ctx->{base_url} //= do {
+ $ctx->zmore(html_top($ctx));
+ base_url($ctx);
+ };
$ctx->zmore($$sref) if $sref;
- $bdy[0] = $ctx->zflush(_html_end($ctx));
- $res_hdr->[3] = bytes::length($bdy[0]);
- [ $code, $res_hdr, \@bdy ]
+ my $bdy = $ctx->zflush(_html_end($ctx));
+ $res_hdr->[3] = bytes::length($bdy);
+ [ $code, $res_hdr, [ $bdy ] ]
}
sub async_next ($) {
my ($ctx, $code, $cb) = @_;
my $res_hdr = [ 'Content-Type' => 'text/html; charset=UTF-8' ];
init($ctx, $cb);
- $ctx->psgi_response($code, $res_hdr, \&async_next, \&async_eml);
+ $ctx->psgi_response($code, $res_hdr);
}
1;