diff options
author | Eric Wong <e@80x24.org> | 2016-01-20 22:17:37 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2016-04-05 18:58:27 +0000 |
commit | b3bc0d722aacdad5ac5e8ee7c32bda9c87d3052b (patch) | |
tree | a9caf00950eacb8a63d4c1b482dcddeba6067d41 | |
parent | e90aa39b6447ceef78d31d4c68291585eb02244a (diff) | |
download | public-inbox-b3bc0d722aacdad5ac5e8ee7c32bda9c87d3052b.tar.gz |
We need to preserve the query string to avoid breakage.
-rw-r--r-- | lib/PublicInbox/Repobrowse.pm | 6 | ||||
-rw-r--r-- | t/repobrowse.t | 21 |
2 files changed, 26 insertions, 1 deletions
diff --git a/lib/PublicInbox/Repobrowse.pm b/lib/PublicInbox/Repobrowse.pm index cc18255d..219b44d6 100644 --- a/lib/PublicInbox/Repobrowse.pm +++ b/lib/PublicInbox/Repobrowse.pm @@ -52,10 +52,14 @@ sub no_tslash { $base =~ s!/+\z!!; $uri = $cgi->request_uri; } + my $qs = ''; + if ($uri =~ s/(\?.+)\z//) { + $qs = $1; + } if ($uri !~ s!/+\z!!) { warn "W: buggy redirect? base=$base request_uri=$uri\n"; } - my $url = $base . $uri; + my $url = $base . $uri . $qs; [ 301, [ Location => $url, 'Content-Type' => 'text/plain' ], [ "Redirecting to $url\n" ] ] diff --git a/t/repobrowse.t b/t/repobrowse.t new file mode 100644 index 00000000..de8a7952 --- /dev/null +++ b/t/repobrowse.t @@ -0,0 +1,21 @@ +# Copyright (C) 2016 all contributors <meta@public-inbox.org> +# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt> +use strict; +use warnings; + +my $test = require './t/repobrowse_common_git.perl'; +test_psgi($test->{app}, sub { + my ($cb) = @_; + my $req = 'http://example.com/test.git/tree/dir'; + my $res = $cb->(GET($req . '/')); + is($res->code, 301, 'got 301 with trailing slash'); + is($res->header('Location'), $req, 'redirected without tslash'); + + my $q = '?id=deadbeef'; + + $res = $cb->(GET($req . "/$q")); + is($res->code, 301, 'got 301 with trailing slash + query string'); + is($res->header('Location'), $req.$q, 'redirected without tslash'); +}); + +done_testing(); |