WwwStream already passes the WWW $ctx to the user-supplied
callback, and it's a trivial change for WwwAtomStream to do
the same. Callers in Feed.pm can now take advantage of that
to save a few kilobytes of memory on every response.
use PublicInbox::WwwAtomStream;
use PublicInbox::SearchMsg; # this loads w/o Search::Xapian
use PublicInbox::WwwAtomStream;
use PublicInbox::SearchMsg; # this loads w/o Search::Xapian
+sub generate_i {
+ my ($ctx) = @_;
+ while (my $smsg = shift @{$ctx->{msgs}}) {
+ $ctx->{-inbox}->smsg_mime($smsg) and return $smsg;
+ }
+}
+
# main function
sub generate {
my ($ctx) = @_;
# main function
sub generate {
my ($ctx) = @_;
- my $msgs = recent_msgs($ctx);
+ my $msgs = $ctx->{msgs} = recent_msgs($ctx);
return _no_thread() unless @$msgs;
return _no_thread() unless @$msgs;
-
- my $ibx = $ctx->{-inbox};
- PublicInbox::WwwAtomStream->response($ctx, 200, sub {
- while (my $smsg = shift @$msgs) {
- $ibx->smsg_mime($smsg) and return $smsg;
- }
- });
+ PublicInbox::WwwAtomStream->response($ctx, 200, \&generate_i);
}
sub generate_thread_atom {
my ($ctx) = @_;
}
sub generate_thread_atom {
my ($ctx) = @_;
- my $mid = $ctx->{mid};
- my $ibx = $ctx->{-inbox};
- my $msgs = $ibx->over->get_thread($mid);
+ my $msgs = $ctx->{msgs} = $ctx->{-inbox}->over->get_thread($ctx->{mid});
return _no_thread() unless @$msgs;
return _no_thread() unless @$msgs;
-
- PublicInbox::WwwAtomStream->response($ctx, 200, sub {
- while (my $smsg = shift @$msgs) {
- $ibx->smsg_mime($smsg) and return $smsg;
- }
- });
+ PublicInbox::WwwAtomStream->response($ctx, 200, \&generate_i);
}
sub generate_html_index {
}
sub generate_html_index {
[ "Redirecting to $url\n" ] ];
}
[ "Redirecting to $url\n" ] ];
}
+sub new_html_i {
+ my ($nr, $ctx) = @_;
+ my $msgs = $ctx->{msgs};
+ while (my $smsg = shift @$msgs) {
+ my $m = $ctx->{-inbox}->smsg_mime($smsg) or next;
+ my $more = scalar @$msgs;
+ return PublicInbox::View::index_entry($m, $ctx, $more);
+ }
+ PublicInbox::View::pagination_footer($ctx, './new.html');
+}
+
sub new_html {
my ($ctx) = @_;
sub new_html {
my ($ctx) = @_;
- my $msgs = recent_msgs($ctx);
+ my $msgs = $ctx->{msgs} = recent_msgs($ctx);
if (!@$msgs) {
return [404, ['Content-Type', 'text/plain'],
["No messages, yet\n"] ];
if (!@$msgs) {
return [404, ['Content-Type', 'text/plain'],
["No messages, yet\n"] ];
$ctx->{-html_tip} = '<pre>';
$ctx->{-upfx} = '';
$ctx->{-hr} = 1;
$ctx->{-html_tip} = '<pre>';
$ctx->{-upfx} = '';
$ctx->{-hr} = 1;
- my $ibx = $ctx->{-inbox};
- PublicInbox::WwwStream->response($ctx, 200, sub {
- while (my $smsg = shift @$msgs) {
- my $m = $ibx->smsg_mime($smsg) or next;
- my $more = scalar @$msgs;
- return PublicInbox::View::index_entry($m, $ctx, $more);
- }
- PublicInbox::View::pagination_footer($ctx, './new.html');
- });
+ PublicInbox::WwwStream->response($ctx, 200, \&new_html_i);
sub getline {
my ($self) = @_;
if (my $middle = $self->{cb}) {
sub getline {
my ($self) = @_;
if (my $middle = $self->{cb}) {
- my $smsg = $middle->();
+ my $smsg = $middle->($self->{ctx});
return feed_entry($self, $smsg) if $smsg;
}
delete $self->{cb} ? '</feed>' : undef;
return feed_entry($self, $smsg) if $smsg;
}
delete $self->{cb} ? '</feed>' : undef;