[Catalyst-dev] [PATCH] Catalyst::Plugin::Session::State::URI overload of uri_for

mike pulsation at gmail.com
Fri Feb 24 00:34:11 CET 2006


this patch adds hooks for uri_for as an alternative to URI rewriting. 
it was prompted by problems with HTML::TokeParser on non-HTML files
and is arguably a better method to rewrite URLs than HTML::TokeParser.

the patch includes tests using a subset of the TestApp in Catalyst
that has been altered for live sessions using
Catalyst::Plugin::Session::Store::Dummy.

this patch will *not* change the default functionality of
Session::State::URI.  if the session configuration key
'overload_uri_for' is true, the session ID will be appended.

=== snip === snip === snip ===
diff -Nru Catalyst-Plugin-Session-State-URI-0.02-orig/lib/Catalyst/Plugin/Session/State/URI.pm
Catalyst-Plugin-Session-State-URI-0.02/lib/Catalyst/Plugin/Session/State/URI.pm
--- Catalyst-Plugin-Session-State-URI-0.02-orig/lib/Catalyst/Plugin/Session/State/URI.pm	2006-01-24
23:30:52.000000000 -0600
+++ Catalyst-Plugin-Session-State-URI-0.02/lib/Catalyst/Plugin/Session/State/URI.pm	2006-02-23
13:38:46.715148904 -0600
@@ -61,6 +61,14 @@
     return $c->config->{session}{rewrite};
 }

+sub uri_for {
+    my ( $c, $path, @args ) = @_;
+
+    return $c->config->{session}{overload_uri_for}
+        ? uri_with_sessionid($c, $c->NEXT::uri_for($path, @args))
+        : $c->NEXT::uri_for($path, @args);
+}
+
 sub uri_with_sessionid {
     my ( $c, $uri ) = @_;

diff -Nru Catalyst-Plugin-Session-State-URI-0.02-orig/t/lib/Catalyst/Plugin/Test/Errors.pm
Catalyst-Plugin-Session-State-URI-0.02/t/lib/Catalyst/Plugin/Test/Errors.pm
--- Catalyst-Plugin-Session-State-URI-0.02-orig/t/lib/Catalyst/Plugin/Test/Errors.pm	1969-12-31
18:00:00.000000000 -0600
+++ Catalyst-Plugin-Session-State-URI-0.02/t/lib/Catalyst/Plugin/Test/Errors.pm	2006-01-10
08:02:25.000000000 -0600
@@ -0,0 +1,32 @@
+package Catalyst::Plugin::Test::Errors;
+
+use strict;
+
+sub error {
+    my $c = shift;
+
+    unless ( $_[0] ) {
+        return $c->NEXT::error(@_);
+    }
+
+    if ( $_[0] =~ /^(Unknown resource|No default action defined)/ ) {
+        $c->response->status(404);
+    }
+
+    if ( $_[0] =~ /^Couldn\'t forward/ ) {
+        $c->response->status(404);
+    }
+
+    if ( $_[0] =~ /^Caught exception/ ) {
+        $c->response->status(500);
+    }
+
+    my $error = $_[0];
+    $error =~ s/\n/, /g;
+
+    $c->response->headers->push_header( 'X-Catalyst-Error' => $error );
+
+    $c->NEXT::error(@_);
+}
+
+1;
diff -Nru Catalyst-Plugin-Session-State-URI-0.02-orig/t/lib/Catalyst/Plugin/Test/Headers.pm
Catalyst-Plugin-Session-State-URI-0.02/t/lib/Catalyst/Plugin/Test/Headers.pm
--- Catalyst-Plugin-Session-State-URI-0.02-orig/t/lib/Catalyst/Plugin/Test/Headers.pm	1969-12-31
18:00:00.000000000 -0600
+++ Catalyst-Plugin-Session-State-URI-0.02/t/lib/Catalyst/Plugin/Test/Headers.pm	2006-02-20
08:21:42.000000000 -0600
@@ -0,0 +1,33 @@
+package Catalyst::Plugin::Test::Headers;
+
+use strict;
+
+sub prepare {
+    my $class = shift;
+
+    my $c = $class->NEXT::prepare(@_);
+
+    $c->response->header( 'X-Catalyst-Engine' => $c->engine );
+    $c->response->header( 'X-Catalyst-Debug' => $c->debug ? 1 : 0 );
+
+    {
+        my $components = join( ', ', sort keys %{ $c->components } );
+        $c->response->header( 'X-Catalyst-Components' => $components );
+    }
+
+    {
+        no strict 'refs';
+        my $plugins = join ', ', $class->registered_plugins;
+        $c->response->header( 'X-Catalyst-Plugins' => $plugins );
+    }
+
+    return $c;
+}
+
+sub prepare_action {
+    my $c = shift;
+    $c->NEXT::prepare_action(@_);
+    $c->res->header( 'X-Catalyst-Action' => $c->req->action );
+}
+
+1;
diff -Nru Catalyst-Plugin-Session-State-URI-0.02-orig/t/lib/Catalyst/Plugin/Test/Plugin.pm
Catalyst-Plugin-Session-State-URI-0.02/t/lib/Catalyst/Plugin/Test/Plugin.pm
--- Catalyst-Plugin-Session-State-URI-0.02-orig/t/lib/Catalyst/Plugin/Test/Plugin.pm	1969-12-31
18:00:00.000000000 -0600
+++ Catalyst-Plugin-Session-State-URI-0.02/t/lib/Catalyst/Plugin/Test/Plugin.pm	2005-12-02
03:30:59.000000000 -0600
@@ -0,0 +1,29 @@
+package Catalyst::Plugin::Test::Plugin;
+
+use strict;
+
+use base qw/Catalyst::Base Class::Data::Inheritable/;
+
+ __PACKAGE__->mk_classdata('ran_setup');
+
+sub setup {
+   my $c = shift;
+   $c->ran_setup('1');
+}
+
+sub  prepare {
+
+    my $class = shift;
+
+    my $c = $class->NEXT::prepare(@_);
+    $c->response->header( 'X-Catalyst-Plugin-Setup' => $c->ran_setup );
+
+    return $c;
+
+}
+
+sub end : Private {
+    my ($self,$c) = @_;
+}
+
+1;
diff -Nru Catalyst-Plugin-Session-State-URI-0.02-orig/t/lib/TestApp/Controller/URI.pm
Catalyst-Plugin-Session-State-URI-0.02/t/lib/TestApp/Controller/URI.pm
--- Catalyst-Plugin-Session-State-URI-0.02-orig/t/lib/TestApp/Controller/URI.pm	1969-12-31
18:00:00.000000000 -0600
+++ Catalyst-Plugin-Session-State-URI-0.02/t/lib/TestApp/Controller/URI.pm	2006-02-23
16:27:08.183492296 -0600
@@ -0,0 +1,58 @@
+package TestApp::Controller::URI;
+
+use strict;
+use base 'Catalyst::Base';
+use Carp;
+$Carp::Verbose = 1;
+
+sub auto : Private {
+    my ( $self, $c ) = @_;
+    $c->config->{session}{overload_uri_for} = 0;
+    $c->session->{key} = "val";
+}
+
+sub index : Private {
+    my ( $self, $c ) = @_;
+    $c->res->body( $c->uri_for("/foo/bar") );
+}
+
+sub arg : Local {
+    my ( $self, $c ) = @_;
+    $c->res->body( $c->uri_for("/foo/bar", "arg") );
+}
+
+sub param : Local {
+    my ( $self, $c ) = @_;
+    $c->res->body( $c->uri_for("/foo/bar", { param => "value" } ) );
+}
+
+sub arg_param : Local {
+    my ( $self, $c ) = @_;
+    $c->res->body( $c->uri_for("/foo/bar", "arg", { param => "value" } ) );
+}
+
+sub sid : Local {
+    my ( $self, $c ) = @_;
+    $c->config->{session}{overload_uri_for} = 1;
+    $c->res->body( $c->uri_for("/foo/bar") );
+}
+
+sub sid_arg : Local {
+    my ( $self, $c ) = @_;
+    $c->config->{session}{overload_uri_for} = 1;
+    $c->res->body( $c->uri_for("/foo/bar", "arg") );
+}
+
+sub sid_param : Local {
+    my ( $self, $c ) = @_;
+    $c->config->{session}{overload_uri_for} = 1;
+    $c->res->body( $c->uri_for("/foo/bar", { param => "value" } ) );
+}
+
+sub sid_arg_param : Local {
+    my ( $self, $c ) = @_;
+    $c->config->{session}{overload_uri_for} = 1;
+    $c->res->body( $c->uri_for("/foo/bar", "arg", { param => "value" } ) );
+}
+
+1;
diff -Nru Catalyst-Plugin-Session-State-URI-0.02-orig/t/lib/TestApp.pm
Catalyst-Plugin-Session-State-URI-0.02/t/lib/TestApp.pm
--- Catalyst-Plugin-Session-State-URI-0.02-orig/t/lib/TestApp.pm	1969-12-31
18:00:00.000000000 -0600
+++ Catalyst-Plugin-Session-State-URI-0.02/t/lib/TestApp.pm	2006-02-23
16:15:47.805925408 -0600
@@ -0,0 +1,23 @@
+package TestApp;
+
+use strict;
+use Catalyst qw/
+    Session
+    Session::Store::Dummy
+    Test::Errors
+    Test::Headers
+    Test::Plugin
+/;
+use Catalyst::Utils;
+
+our $VERSION = '0.01';
+
+TestApp->config( name => 'TestApp', root => '/some/dir', session => {
param => 'sid', rewrite => 0 } );
+
+TestApp->setup(qw/Session::State::URI/);
+
+{
+    no warnings 'redefine';
+    sub Catalyst::Log::error { }
+}
+1;
diff -Nru Catalyst-Plugin-Session-State-URI-0.02-orig/t/lib/TestAppSession.pm
Catalyst-Plugin-Session-State-URI-0.02/t/lib/TestAppSession.pm
--- Catalyst-Plugin-Session-State-URI-0.02-orig/t/lib/TestAppSession.pm	1969-12-31
18:00:00.000000000 -0600
+++ Catalyst-Plugin-Session-State-URI-0.02/t/lib/TestAppSession.pm	2006-02-23
15:45:12.516931744 -0600
@@ -0,0 +1,21 @@
+package TestAppSession;
+
+use strict;
+use Catalyst qw/
+    Test::Errors
+    Test::Headers
+    Test::Plugin
+/;
+use Catalyst::Utils;
+
+our $VERSION = '0.01';
+
+TestApp->config( name => 'TestApp', root => '/some/dir', session => {
param => 'sid', overload_uri_for => 1 } );
+
+TestApp->setup(qw/Session::State::URI/);
+
+{
+    no warnings 'redefine';
+    sub Catalyst::Log::error { }
+}
+1;
diff -Nru Catalyst-Plugin-Session-State-URI-0.02-orig/t/live_uri_for.t
Catalyst-Plugin-Session-State-URI-0.02/t/live_uri_for.t
--- Catalyst-Plugin-Session-State-URI-0.02-orig/t/live_uri_for.t	1969-12-31
18:00:00.000000000 -0600
+++ Catalyst-Plugin-Session-State-URI-0.02/t/live_uri_for.t	2006-02-23
16:27:23.545156968 -0600
@@ -0,0 +1,47 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use FindBin;
+use lib "$FindBin::Bin/lib";
+
+use Test::More tests => 19;
+use Test::MockObject::Extends;
+use URI;
+
+use Catalyst::Test 'TestApp';
+use Catalyst::Request;
+
+my $m;
+BEGIN { use_ok( $m = "Catalyst::Plugin::Session::State::URI" ) }
+
+can_ok( $m, "uri_with_sessionid" );
+can_ok( $m, "uri_for" );
+
+my $response;
+
+ok ( $response = request('http://localhost/uri'), 'Request' );
+ok ( $response->content eq "http://localhost/foo/bar" );
+
+ok ( $response = request('http://localhost/uri/arg'), 'Request' );
+ok ( $response->content eq "http://localhost/foo/bar/arg" );
+
+ok ( $response = request('http://localhost/uri/param'), 'Request' );
+ok ( $response->content eq "http://localhost/foo/bar?param=value" );
+
+ok ( $response = request('http://localhost/uri/arg_param'), 'Request' );
+ok ( $response->content eq "http://localhost/foo/bar/arg?param=value" );
+
+ok ( $response = request('http://localhost/uri/sid'), 'Request' );
+ok ( $response->content =~ qr(^http://localhost/foo/bar\?sid=[a-z0-9]+$) );
+
+ok ( $response = request('http://localhost/uri/sid_arg'), 'Request' );
+ok ( $response->content =~ qr(^http://localhost/foo/bar/arg\?sid=[a-z0-9]+$) );
+
+ok ( $response = request('http://localhost/uri/sid_param'), 'Request' );
+ok ( $response->content =~
qr(^http://localhost/foo/bar\?param=value&sid=[a-z0-9]+$) );
+
+ok ( $response = request('http://localhost/uri/sid_arg_param'), 'Request' );
+ok ( $response->content =~
qr(^http://localhost/foo/bar/arg\?param=value&sid=[a-z0-9]+$) );
+
=== snip === snip === snip ===



More information about the Catalyst-dev mailing list