X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FWwwStream.pm;h=e06e3456ae19cbf163fcae457cce533f58bf33c0;hb=6c853f5256f3a324c018a37a9e8a6b9fc8fdc063;hp=eecc27019da163d095d0c933b79b1fedf298d0af;hpb=0179230221231f8f5a3edc2f2836cc7c7e089dda;p=public-inbox.git
diff --git a/lib/PublicInbox/WwwStream.pm b/lib/PublicInbox/WwwStream.pm
index eecc2701..e06e3456 100644
--- a/lib/PublicInbox/WwwStream.pm
+++ b/lib/PublicInbox/WwwStream.pm
@@ -1,17 +1,16 @@
# Copyright (C) 2016-2020 all contributors
# License: AGPL-3.0+
#
-# 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';
@@ -29,15 +28,7 @@ sub init {
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)));
}
@@ -52,6 +43,13 @@ sub html_top ($) {
my $color = $upfx.'_/text/color';
my $atom = $ctx->{-atom} || $upfx.'new.atom';
my $top = "$desc";
+ if (my $t_max = $ctx->{-t_max}) {
+ $t_max = ts2str($t_max);
+ $top = qq($top);
+ # we had some kind of query, link to /$INBOX/?t=YYYYMMDDhhmmss
+ } elsif ($ctx->{qp}->{t}) {
+ $top = qq($top);
+ }
my $links = "help / ".
"color / ".
"Atom feed";
@@ -174,17 +172,18 @@ sub getline {
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 ($) {
@@ -206,7 +205,7 @@ sub aresponse {
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;