Revert to old behaviour, allow config for new behaviour. Config option name is rubbis...
Tomas Doran [Sun, 2 May 2010 22:26:22 +0000 (22:26 +0000)]
lib/Catalyst.pm
lib/Catalyst/Engine/CGI.pm
t/aggregate/live_component_controller_args.t
t/lib/TestApp.pm

index 34d3d58..04a8ad4 100644 (file)
@@ -1321,7 +1321,7 @@ sub uri_for {
     # join args with '/', or a blank string
     my $args = join('/', grep { defined($_) } @args);
     $args =~ s/\?/%3F/g; # STUPID STUPID SPECIAL CASE
-#    $args =~ s!^/+!!;
+    $args =~ s!^/+!!;
     my $base = $c->req->base;
     my $class = ref($base);
     $base =~ s{(?<!/)$}{/};
@@ -1890,7 +1890,7 @@ namespaces.
 
 sub get_actions { my $c = shift; $c->dispatcher->get_actions( $c, @_ ) }
 
-=head2 $c->handle_request( $class, @arguments )
+=head2 $app->handle_request( @arguments )
 
 Called to handle each HTTP request.
 
index 3f2ef67..318240d 100644 (file)
@@ -154,27 +154,28 @@ sub prepare_path {
     # See https://issues.apache.org/bugzilla/show_bug.cgi?id=35256
     # Here we try to resurrect the original encoded URI from REQUEST_URI.
     my $path_info   = $ENV{PATH_INFO};
-#    if (my $req_uri = $ENV{REQUEST_URI}) {
-#        $req_uri =~ s/^\Q$base_path\E//;
-#        $req_uri =~ s/\?.*$//;
-#        if ($req_uri && $req_uri ne '/') {
-            # This means that REQUEST_URI needs information from PATH_INFO
-            # prepending to it to be useful, otherwise the sub path which is
-            # being redirected to becomes the app base address which is
-            # incorrect.
-#            my ($match) = $req_uri =~ m{^(/?[^/]+)};
-#            my ($path_info_part) = $path_info =~ m|^(.*?\Q$match\E)|;
-#            substr($req_uri, 0, length($match), $path_info_part)
-#                if $path_info_part;
-#            $path_info = $req_uri;
-#        }
-#    }
-    $path_info =~ s/%2F/%252F/g;
+    if ($c->config->{rfc3875_paths}) {
+        if (my $req_uri = $ENV{REQUEST_URI}) {
+            $req_uri =~ s/^\Q$base_path\E//;
+            $req_uri =~ s/\?.*$//;
+            if ($req_uri && $req_uri ne '/') {
+                # This means that REQUEST_URI needs information from PATH_INFO
+                # prepending to it to be useful, otherwise the sub path which is
+                # being redirected to becomes the app base address which is
+                # incorrect.
+                # FIXME - This stuff is shit, we should get REDIRECT_URI, right?
+                my ($match) = $req_uri =~ m{^(/?[^/]+)};
+                my ($path_info_part) = $path_info =~ m|^(.*?\Q$match\E)|;
+                substr($req_uri, 0, length($match), $path_info_part)
+                    if $path_info_part;
+                $path_info = $req_uri;
+            }
+        }
+    }
+
     # set the request URI
-    warn("Base path $base_path, path_info $path_info");
     my $path = $base_path . ( $path_info || '' );
     $path =~ s{^/+}{};
-    $base_path .= '/' unless $base_path =~ m{/$};
 
     # Using URI directly is way too slow, so we construct the URLs manually
     my $uri_class = "URI::$scheme";
index 29d26a1..93b757c 100644 (file)
@@ -73,15 +73,15 @@ sub run_test_for {
 
         my $response;
 
-        ok( $response = request("http://localhost/args/args/$path"), "Requested args for path $path");
+        ok( $response = request("http://localhost/args/args/$path"), "Requested /args/args/$path");
 
         is( $response->content, $test, "$test as args" );
 
         undef $response;
 
-        ok( $response = request("http://localhost/args/params/$path"), "Requested params for path $path");
+        ok( $response = request("http://localhost/args/params/$path"), "Requested /args/params/$path");
 
-        is( $response->content, $test, "$test as params" );
+        is( $response->content, $test, "response content $test as params" );
 
         undef $response;
 
index 1e4d5c4..9ee303d 100644 (file)
@@ -18,7 +18,7 @@ use namespace::autoclean;
 
 our $VERSION = '0.01';
 
-TestApp->config( name => 'TestApp', root => '/some/dir' );
+TestApp->config( name => 'TestApp', root => '/some/dir', rfc3875_paths => 1 );
 
 if ($::setup_leakchecker && eval { Class::MOP::load_class('CatalystX::LeakChecker'); 1 }) {
     with 'CatalystX::LeakChecker';