package TestModperl::io_nested_with_closed_stds; # test that we can successfully override STD(IN|OUT) for # 'perl-script', even if they are closed. Here we use # internal_redirect(), which causes a nested override of already # overriden STD streams # in this test we can't use my $foo as a filehandle, since perl 5.6 # doesn't know how to dup via: 'open STDIN, "<&", $oldin' # so use the old FOO filehandle style use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::SubRequest (); use Apache::Test; use Apache::TestUtil; use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; my $args = $r->args || ''; if ($args eq 'redirect') { # sub-req $r->content_type('text/plain'); # do not use plan() here, since it messes up with STDOUT, # which affects this test. print "1..1\nok 1\n"; } else { # main-req my $redirect_uri = $r->uri . "?redirect"; # we must close STDIN as well, due to a perl bug (5.8.0 - 5.8.3 # w/useperlio), which emits a warning if dup is called with # one of the STD streams is closed. # but we must restore the STD streams so not to affect other # tests. open OLDIN, "<&STDIN" or die "Can't dup STDIN: $!"; open OLDOUT, ">&STDOUT" or die "Can't dup STDOUT: $!"; close STDIN; close STDOUT; $r->internal_redirect($redirect_uri); open STDIN, "<&OLDIN" or die "Can't dup OLDIN: $!"; open STDOUT, ">&OLDOUT" or die "Can't dup OLDOUT: $!"; close OLDIN; close OLDOUT; } Apache2::Const::OK; } 1; __DATA__ SetHandler perl-script