blob: c8a225f2addea51b3cec7915ffc564a319310bc8 [file] [log] [blame]
# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*-
package TestModperl::request_rec_perlio_api;
# this test is relevant only when the PerlIO STDIN/STDOUT are used (when
# $Config{useperlio} is defined.)
use strict;
use warnings FATAL => 'all';
use Apache2::RequestIO ();
use Apache2::RequestRec ();
use Apache::Test;
use File::Spec::Functions qw(catfile catdir);
use Apache2::Const -compile => 'OK';
sub handler {
my $r = shift;
$r->args eq 'STDIN' ? test_STDIN($r) : test_STDOUT($r);
return Apache2::Const::OK;
}
sub test_STDIN {
my $r = shift;
{
# read the first 10 POST chars
my $data;
read STDIN, $data, 10;
print STDOUT $data;
}
{
# re-open STDIN to something else, and then see if we don't
# lose any chars when we restore it to the POST stream
open my $stdin, "<&STDIN" or die "Can't dup STDIN: $!";
open STDIN, "<", __FILE__
or die "failed to open STDIN as 'in memory' file : $!";
my $data;
read STDIN, $data, length("# please");
print STDOUT $data;
close STDIN;
open STDIN, "<&", $stdin or die "failed to restore STDIN: $!";
}
{
# read the last 10 POST chars
my $data;
read STDIN, $data, 10;
print STDOUT $data;
}
}
sub test_STDOUT {
my $r = shift;
local $| = 0;
print STDOUT "life is hard ";
my $vars = Apache::Test::config()->{vars};
my $target_dir = catdir $vars->{documentroot}, 'perlio';
my $file = catfile $target_dir, "apache_stdout";
# re-open STDOUT to something else, and then see if we can
# continue printing to the client via STDOUT, after restoring it
open my $stdout, ">&STDOUT" or die "Can't dup STDOUT: $!";
# this should flush the above print to STDOUT
open STDOUT, ">", $file or die "Can't open $file: $!";
print STDOUT "and then ";
close STDOUT;
# flush things that went into the file as STDOUT
open STDOUT, ">&", $stdout or die "failed to restore STDOUT: $!";
open my $fh, $file or die "Can't open $file: $!";
local $\;
print <$fh>;
# cleanup
unlink $file;
# close the dupped fh
close $stdout;
print "you die! ";
# now close it completely and restore it, without using any dupped
# filehandle
close STDOUT;
open STDOUT, ">:Apache2", $r
or die "can't open STDOUT via :Apache2 layer : $!";
print "next you reincarnate...";
}
1;
__DATA__
SetHandler perl-script