about summary refs log tree commit homepage
diff options
context:
space:
mode:
-rw-r--r--lib/PublicInbox/Repobrowse.pm6
-rw-r--r--t/repobrowse.t21
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();