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;