[Catalyst-commits] r9656 - in trunk/Catalyst-Controller-WrapCGI: . lib/Catalyst/Controller t

hdp at dev.catalyst.perl.org hdp at dev.catalyst.perl.org
Fri Apr 3 22:31:36 BST 2009


Author: hdp
Date: 2009-04-03 22:31:36 +0100 (Fri, 03 Apr 2009)
New Revision: 9656

Added:
   trunk/Catalyst-Controller-WrapCGI/t/env.t
Modified:
   trunk/Catalyst-Controller-WrapCGI/Changes
   trunk/Catalyst-Controller-WrapCGI/lib/Catalyst/Controller/WrapCGI.pm
Log:
add kill_env

Modified: trunk/Catalyst-Controller-WrapCGI/Changes
===================================================================
--- trunk/Catalyst-Controller-WrapCGI/Changes	2009-04-03 15:25:01 UTC (rev 9655)
+++ trunk/Catalyst-Controller-WrapCGI/Changes	2009-04-03 21:31:36 UTC (rev 9656)
@@ -15,7 +15,10 @@
 0.0025  2009-01-09 14:59:20
     Tell Static::Simple to ignore root/cgi-bin for C::C::CGIBin
 
-0.0026  UNRELEASED
+0.0026  2009-02-02
     Stop storing generated files in SVN and add svn:ignore.
     Remove taint from tests as this breaks in a local::lib environment
     as PERL5LIB is stripped.
+
+0.0027
+    Add 'kill_env' and default to killing 'MOD_PERL' from environment.

Modified: trunk/Catalyst-Controller-WrapCGI/lib/Catalyst/Controller/WrapCGI.pm
===================================================================
--- trunk/Catalyst-Controller-WrapCGI/lib/Catalyst/Controller/WrapCGI.pm	2009-04-03 15:25:01 UTC (rev 9655)
+++ trunk/Catalyst-Controller-WrapCGI/lib/Catalyst/Controller/WrapCGI.pm	2009-04-03 21:31:36 UTC (rev 9656)
@@ -47,6 +47,7 @@
             pass_env PERL5LIB
             pass_env PATH
             pass_env /^MYAPP_/
+            kill_env MOD_PERL
         </CGI>
     </Controller::Foo>
 
@@ -62,15 +63,21 @@
 
 =head1 CONFIGURATION
 
-C<$your_controller->{CGI}{pass_env}> should be an array of environment variables
+C<< $your_controller->{CGI}{pass_env} >> should be an array of environment variables
 or regular expressions to pass through to your CGIs. Entries surrounded by C</>
 characters are considered regular expressions.
 
-Default is to pass the whole of C<%ENV>.
+C<< $your_controller->{CGI}{kill_env} >> should be an array of environment
+variables or regular expressions to remove from the environment before passing
+it to your CGIs.  Entries surrounded by C</> characters are considered regular
+expressions.
 
-C<{CGI}{username_field}> should be the field for your user's name, which will be
-read from C<$c->user->obj>. Defaults to 'username'.
+Default is to pass the whole of C<%ENV>, except for C<MOD_PERL> (that is, the
+default C<kill_env> is C<[ 'MOD_PERL' ]>.
 
+C<< $your_controller->{CGI}{username_field} >> should be the field for your user's name, which will be
+read from C<< $c->user->obj >>. Defaults to 'username'.
+
 See L</SYNOPSIS> for an example.
 
 =cut
@@ -125,6 +132,42 @@
 
 =cut
 
+sub _filtered_env {
+  my ($self, $env) = @_;
+  my @ok;
+
+  my $pass_env = $self->{CGI}{pass_env};
+  $pass_env = []            if not defined $pass_env;
+  $pass_env = [ $pass_env ] unless ref $pass_env;
+
+  my $kill_env = $self->{CGI}{kill_env};
+  $kill_env = [ 'MOD_PERL' ] unless defined $kill_env;
+  $kill_env = [ $kill_env ]  unless ref $kill_env;
+
+  if (@$pass_env) {
+    for (@$pass_env) {
+      if (m!^/(.*)/\z!) {
+        my $re = qr/$1/;
+        push @ok, grep /$re/, keys %$env;
+      } else {
+        push @ok, $_;
+      }
+    }
+  } else {
+    @ok = keys %$env;
+  }
+
+  for my $k (@$kill_env) {
+    if ($k =~ m!^/(.*)/\z!) {
+      my $re = qr/$1/;
+      @ok = grep { ! /$re/ } @ok;
+    } else {
+      @ok = grep { $_ ne $k } @ok;
+    }
+  }
+  return { map {; $_ => $env->{$_} } @ok };
+}
+
 sub wrap_cgi {
   my ($self, $c, $call) = @_;
   my $req = HTTP::Request->new(
@@ -147,23 +190,8 @@
     }
   }
 
-  my @env;
+  my $filtered_env = $self->_filtered_env(\%ENV);
 
-  my $pass_env = $self->{CGI}{pass_env};
-  $pass_env = []            if not defined $pass_env;
-  $pass_env = [ $pass_env ] unless ref $pass_env;
-
-  for (@$pass_env) {
-    if (m!^/(.*)/\z!) {
-      my $re = qr/$1/;
-      push @env, grep /$re/, keys %ENV;
-    } else {
-      push @env, $_;
-    }
-  }
-
-  @env = keys %ENV unless @env;
-
   $req->content($body_content);
   $req->content_length(length($body_content));
 
@@ -175,7 +203,7 @@
   my $env = HTTP::Request::AsCGI->new(
               $req,
               ($username ? (REMOTE_USER => $username) : ()),
-              map { ($_, $ENV{$_}) } @env
+              %$filtered_env,
             );
 
   {

Added: trunk/Catalyst-Controller-WrapCGI/t/env.t
===================================================================
--- trunk/Catalyst-Controller-WrapCGI/t/env.t	                        (rev 0)
+++ trunk/Catalyst-Controller-WrapCGI/t/env.t	2009-04-03 21:31:36 UTC (rev 9656)
@@ -0,0 +1,40 @@
+use strict;
+use warnings;
+
+use Test::More tests => 3;
+use Catalyst::Controller::WrapCGI;
+
+my $obj = Catalyst::Controller::WrapCGI->new;
+
+my $want = {%ENV};
+my $have = {%ENV};
+{
+  local $have->{MOD_PERL} = 1;
+  is_deeply(
+    $obj->_filtered_env($have),
+    $want,
+    "default: pass all except MOD_PERL",
+  );
+}
+
+{
+  local $obj->{CGI}{pass_env} = 'MOD_PERL';
+  local $have->{MOD_PERL} = 1;
+  is_deeply(
+    $obj->_filtered_env($have),
+    {},
+    "empty when all passes are killed",
+  );
+}
+
+{
+  local $obj->{CGI}{kill_env} = [];
+  local $have->{MOD_PERL} = 1;
+  local $want->{MOD_PERL} = 1;
+  is_deeply(
+    $obj->_filtered_env($have),
+    $want,
+    "explicit override for default kill",
+  );
+}
+




More information about the Catalyst-commits mailing list