sub ext_msg_i {
my ($other, $ctx) = @_;
- return if $other->{name} eq $ctx->{ibx}->{name} || !$other->base_url;
+ return if $other->{name} eq $ctx->{ibx}->{name} ||
+ !$other->base_url(@{$ctx->{-url_env}});
my $mm = $other->mm or return;
$k =~ s/:[0-9]+:$x->{blob}\z// or next;
next if $k eq $cur_key;
my $ibx = $by_eidx_key->{$k} // next;
- $ibx->base_url or next;
+ $ibx->base_url(@{$ctx->{-url_env}}) or next;
push(@{$ctx->{found}}, $ibx) unless $seen{$k}++;
}
}
partial_response($ctx);
}
+# only public entry point
sub ext_msg {
my ($ctx) = @_;
+ @{$ctx->{-url_env}} = $ctx->{www}->{pi_cfg}->{
+ lc 'publicinbox.nameIsUrl'} ? ($ctx->{env}) : ();
ext_msg_ALL($ctx) // sub {
$ctx->{-wcb} = $_[0]; # HTTP server write callback
finalize_partial($ctx);
}
-sub _url_pfx ($$) {
- my ($ctx, $u) = @_;
+sub _url_pfx ($$;$) {
+ my ($ctx, $ibx, $env) = @_;
+ my $u = $ibx->base_url(@{$env // $ctx->{-url_env}}) // return;
(index($u, '://') < 0 && index($u, '/') != 0) ?
"$ctx->{-upfx}../$u" : $u;
}
$n_partial .= '+' if ($n_partial == PARTIAL_MAX);
$s .= "\n$n_partial partial match$es found:\n\n";
my $cur_name = $ctx->{ibx}->{name};
+ my $e = [ $ctx->{env} ];
foreach my $pair (@{$ctx->{partial}}) {
my ($ibx, $res) = @$pair;
- my $e = $ibx->{name} eq $cur_name ? $ctx->{env} : undef;
- my $u = _url_pfx($ctx, $ibx->base_url($e) // next);
+ my $u = _url_pfx($ctx, $ibx,
+ $ibx->{name} eq $cur_name ? $e : undef) // next;
foreach my $m (@$res) {
my $href = mid_href($m);
my $html = ascii_html($m);
$ctx->{-html_tip} = join('',
"<pre>Message-ID: <$html>\nfound in $end:\n\n",
(map {
- my $u = _url_pfx($ctx, $_->base_url);
+ my $u = _url_pfx($ctx, $_);
qq(<a\nhref="$u$href/">$u$html/</a>\n)
} @$found),
$ext_urls, '</pre>');
}
sub try_inbox {
- my ($ibx, $arg) = @_;
+ my ($ibx, $arg, @url_env) = @_;
return if scalar(@$arg) > 1;
# do not pass $env since HTTP_HOST may differ
- my $url = $ibx->base_url or return;
+ my $url = $ibx->base_url(@url_env) or return;
my ($mid) = @$arg;
eval { $ibx->mm->num_for($mid) } or return;
[ 404, [qw(Content-Type text/plain)], ["404 Not Found\n"] ];
my ($ng, $article) = @parts;
my $pi_cfg = $self->{pi_cfg};
+ my @url_env = $pi_cfg->{lc 'publicinbox.nameIsUrl'} ? ($env) : ();
if (my $ibx = $pi_cfg->lookup_newsgroup($ng)) {
- my $url = prurl($env, $ibx->{url});
+ my $url = prurl($env, $ibx->{url} // $ibx->base_url(@url_env));
my $code = 301;
if (defined $article && $article =~ /\A[0-9]+\z/) {
my $mid = eval { $ibx->mm->mid_for($article) };
s/:[0-9]+:$x->{blob}\z// or next;
my $ibx = $by_eidx_key->{$_} // next;
my $url = $ALL->base_url($env) //
- $ibx->base_url // next;
+ $ibx->base_url(@url_env) //
+ next;
$url .= mid_escape($mid) . '/';
return redirect(302, $url);
}
} else { # slow path, scan every inbox
for my $mid (@try) {
my $arg = [ $mid ]; # [1] => result
- $pi_cfg->each_inbox(\&try_inbox, $arg);
+ $pi_cfg->each_inbox(\&try_inbox, $arg, @url_env);
return $arg->[1] if $arg->[1];
}
}