From b3bc0d722aacdad5ac5e8ee7c32bda9c87d3052b Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Wed, 20 Jan 2016 22:17:37 +0000 Subject: repobrowse: fix redirects with query string We need to preserve the query string to avoid breakage. --- lib/PublicInbox/Repobrowse.pm | 6 +++++- t/repobrowse.t | 21 +++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 t/repobrowse.t 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 +# License: AGPL-3.0+ +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(); -- cgit v1.2.3-24-ge0c7