my $env = $req->{env};
my $base = PublicInbox::Repobrowse::base_url($env);
my ($redir) = @extra;
- if ($redir =~ m!\A\.\./!) { # relative redirect
+ if (index($redir, '/') != 0) { # relative redirect
my @orig = split(m!/+!, $env->{PATH_INFO});
my @dest = split(m!/+!, $redir);
$end = pop @dest if $dest[-1] =~ /\A[#\?]/;
$redir = $base . join('/', @orig, @dest) . $end;
} else {
- $redir = $base . '/' . $redir;
+ $redir = $base . $redir;
}
push @h, qw(Content-Type text/plain Location), $redir;
my ($self, $req) = @_;
my $repo = $req->{-repo};
my $git = $repo->{git};
- my $tip = $req->{tip} || $req->{repo}->tip;
+ my $tip = $req->{tip} or return $self->r(302, $req, $repo->tip);
sub {
my ($res) = @_;
$git->check_async($req->{env}, "$tip:$req->{expath}", sub {
my ($req) = @_;
my @ex = @{$req->{extra}} or return '<b>root</b>';
my $s;
- my $tip = $req->{tip} || $req->{repo}->tip;
+ my $tip = $req->{tip};
my $rel = $req->{relcmd};
# avoid relative paths, here, we don't want to propagate
# trailing-slash URLs although we tolerate them
my @lines;
my $buf = '';
my $rel = $req->{relcmd};
- my $tip = $req->{tip} || $req->{repo}->tip;
+ my $tip = $req->{tip};
my $raw = join('/', "${rel}raw", $tip, @{$req->{extra}});
$raw = PublicInbox::Hval->utf8($raw)->as_path;
my $t = cur_path($req);
$req->{thtml} .= "\npath: $t\n\n<b>mode\tsize\tname</b>\n";
if (defined(my $last = $req->{extra}->[-1])) {
$pfx = PublicInbox::Hval->utf8($last)->as_path;
- } elsif (defined(my $tip = $req->{tip})) {
- $pfx = $tip;
} else {
- $pfx = 'src/' . $req->{-repo}->tip;
+ $pfx = 'src/' . $req->{tip};
}
$req->{tpfx} = $pfx;
my $env = $req->{env};
like($noslash_body, qr{href="dir/dur">dur/</a>},
'path ok w/o slash');
+ $req = 'http://example.com/test.git/src';
+ $res = $cb->(GET($req));
+ is(302, $res->code, 'got 302 response from dir');
+ is("$req/master", $res->header('Location'), 'redirected to tip');
+
my $slash = $req . '/';
my $r2 = $cb->(GET($slash));
is(301, $r2->code, 'got 301 response from dir with slash');