]> git.ipfire.org Git - thirdparty/public-inbox.git/commitdiff
repobrowse: fix redirects with query string
authorEric Wong <e@80x24.org>
Wed, 20 Jan 2016 22:17:37 +0000 (22:17 +0000)
committerEric Wong <e@80x24.org>
Tue, 5 Apr 2016 18:58:27 +0000 (18:58 +0000)
We need to preserve the query string to avoid breakage.

lib/PublicInbox/Repobrowse.pm
t/repobrowse.t [new file with mode: 0644]

index cc18255dc24306181c3f09842aa7046bbb7ac322..219b44d6b0919f3d97cc846184992b66244e0679 100644 (file)
@@ -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 (file)
index 0000000..de8a795
--- /dev/null
@@ -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();