fu: Close-up of Fu, bringing a scoop of water to her mouth (Default)
fu ([personal profile] fu) wrote in [site community profile] changelog2011-10-03 05:42 am

[dw-free] Automatic .../index redirects do not preserve get arguments.

[commit: http://hg.dwscoalition.org/dw-free/rev/3c1dde8411c1]

http://bugs.dwscoalition.org/show_bug.cgi?id=3972

Preserve URL arguments over redirects.

Patch by [personal profile] exor674.

Files modified:
  • cgi-bin/DW/Routing.pm
  • cgi-bin/DW/Routing/Test.pm
  • t/routing-indexes.t
--------------------------------------------------------------------------------
diff -r 98e530f23e6f -r 3c1dde8411c1 cgi-bin/DW/Routing.pm
--- a/cgi-bin/DW/Routing.pm	Sun Oct 02 20:34:03 2011 -0500
+++ b/cgi-bin/DW/Routing.pm	Mon Oct 03 13:41:38 2011 +0800
@@ -248,7 +248,13 @@
 # controller sub for register_redirect
 sub _redirect_helper {
     my $r = DW::Request->get;
-    return $r->redirect( $_[0]->args );
+    my $data = $_[0]->args;
+
+    if ( $data->{full_uri} ) {
+        return $r->redirect( $data->{dest} );
+    } else {
+        return $r->redirect( LJ::create_url( $data->{dest}, keep_args => $data->{keep_args} ) );
+    }
 }
 
 =head1 Registration API
@@ -324,6 +330,7 @@
             formats => $hash->{formats},
             format => $hash->{format},
             no_redirects => 1,
+            keep_args => 1,
         );
         $class->register_redirect( $2, $1, %opts ) if $2;
         $string_choices{'app'  . $1} = $hash if $hash->{app};
@@ -344,6 +351,14 @@
 
 =item Opts ( see register_string )
 
+=over
+
+=item keep_args - Persist GET arguments over redirect ( same as the keep_args argument to create_url ).
+
+=item full_uri - A full URI ( http://...../foo v.s. /foo )
+
+=back
+
 =back
 
 =cut
@@ -351,7 +366,11 @@
 sub register_redirect {
     my ( $class, $string, $dest, %opts ) = @_;
 
-    $opts{args} = $dest;
+    my $args = { dest => $dest };
+    $args->{keep_args} = delete $opts{keep_args} || 0;
+    $args->{full_uri} = delete $opts{full_uri} || 0;
+
+    $opts{args} = $args;
     $class->register_string( $string, \&_redirect_helper, %opts );
 }
 
@@ -415,7 +434,7 @@
 
 =head1 COPYRIGHT AND LICENSE
 
-Copyright (c) 2009-2010 by Dreamwidth Studios, LLC.
+Copyright (c) 2009-2011 by Dreamwidth Studios, LLC.
 
 This program is free software; you may redistribute it and/or modify it under
 the same terms as Perl itself. For a copy of the license, please reference
diff -r 98e530f23e6f -r 3c1dde8411c1 cgi-bin/DW/Routing/Test.pm
--- a/cgi-bin/DW/Routing/Test.pm	Sun Oct 02 20:34:03 2011 -0500
+++ b/cgi-bin/DW/Routing/Test.pm	Mon Oct 03 13:41:38 2011 +0800
@@ -118,11 +118,16 @@
 
 sub handle_redirect {
     my ( $uri, $expected ) = @_;
-    my $tb = $CLASS->builder;
     $CLASS->builder->subtest($uri, sub {
-        my $req = HTTP::Request->new(GET=>"$uri");
+        my $tb = $CLASS->builder;
+        $tb->plan( tests => 3 );
 
-        my $opts = DW::Routing->get_call_opts( uri => $uri );
+        my $req = HTTP::Request->new(GET=>"http://www.example.com$uri");
+        $req->header( Host => 'www.example.com' );
+        DW::Request->reset;
+        my $r = DW::Request::Standard->new($req);
+
+        my $opts = DW::Routing->get_call_opts( );
 
         unless ( $opts ) {
             ok( 0, "opts exists" );
@@ -135,16 +140,26 @@
         unless ( $hash && $hash->{sub} ) {
              ok( 0, "improper opts" );
              _skip("opts are improper");
+             return;
         }
 
         is( $hash->{sub}, \&DW::Routing::_redirect_helper );
-        is( $hash->{args}, $expected );
+        # Safe to call!
+
+        my $rv = DW::Routing->call_hash( $opts );
+
+        is( $rv, $r->REDIRECT );
+        if ( substr($expected,0,1) == '/' ) {
+            is( $r->header_out( 'Location' ), "http://www.example.com$expected" );
+        } else {
+            is( $r->header_out( 'Location' ), $expected );
+        }
+
     });
 }
 
 sub handle_server_error {
     my ( $name, $uri, $format, %opts ) = @_;
-    my $tb = $CLASS->builder;
     $CLASS->builder->subtest($name, sub {
         DW::Request->reset;
 
diff -r 98e530f23e6f -r 3c1dde8411c1 t/routing-indexes.t
--- a/t/routing-indexes.t	Sun Oct 02 20:34:03 2011 -0500
+++ b/t/routing-indexes.t	Mon Oct 03 13:41:38 2011 +0800
@@ -16,7 +16,7 @@
 use strict;
 
 use lib "$ENV{LJHOME}/cgi-bin";
-use DW::Routing::Test tests => 5;
+use DW::Routing::Test tests => 6;
 
 $DW::Routing::T_TESTING_ERRORS = 1;
 
@@ -29,10 +29,13 @@
 handle_request( "/xx3/" , "/xx3/", 1, "it_worked_redir" );
 handle_request( "/xx3/index" , "/xx3/index", 1, "it_worked_redir" );
 handle_redirect( '/xx3', '/xx3/' );
-# 3
+
+handle_redirect( '/xx3?kittens=cute', '/xx3/?kittens=cute' );
+
+# 4
 
 DW::Routing->register_string( "/index", \&handler, app => 1, args => "it_worked_redir" );
 
 handle_request( "/" , "/", 1, "it_worked_redir" );
 handle_request( "/index" , "/index", 1, "it_worked_redir" );
-# 5
+# 6
--------------------------------------------------------------------------------

Post a comment in response:

This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org