blob: 0db61d8057b41a0b39ff52f05686b876c6ae0ef0 [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 TestFilter::both_str_req_mix;
# this is an elaborated test, where we mix several apache and mod_perl
# filters, both input and output and verifying that they can work
# together, preserving the order when the filters are of the same
# priority
# in this test the client, the client sends a compressed body,
# 'DEFLATE' deflates it, then mod_perl filter 'transparent' filter
# passes data through as-is. The following 'in_adjust' mod_perl filter
# removes the string 'INPUT' from incoming data. The response handler
# simply passes the data through. Next output filters get to work:
# 'out_adjust_before_ssi' fixups the data to a valid SSI directive, by
# removing the string 'OUTPUT' from the outgoing data, then the
# 'INCLUDES' filter fetches the virtual file, and finally
# 'out_adjust_after_ssi' fixes the file contents returned by SSI, by
# removing the string 'REMOVE'
#
# Here is a visual representation of the transformations:
#
# => <network in>
#
# compressed data
#
# => DEFLATE
#
# <!--#include INPUTvirtual="/includes/OUTPUTclear.shtml" -->
#
# => transparent
#
# <!--#include INPUTvirtual="/includes/OUTPUTclear.shtml" -->
#
# => in_adjust
#
# <!--#include virtual="/includes/OUTPUTclear.shtml" -->
#
# <=> response handler
#
# <!--#include virtual="/includes/OUTPUTclear.shtml" -->
#
# <= out_adjust_before_ssi
#
# <!--#include virtual="/includes/clear.shtml" -->
#
# <= out_adjust_before_ssi
#
# <!--#include virtual="/includes/clear.shtml" -->
#
# <= INCLUDES
#
# This is a REMOVEclear text
#
# <= out_adjust_after_ssi
#
# This is a clear text
#
# <= DEFLATE
#
# compressed data
#
# <= <network out>
use strict;
use warnings FATAL => 'all';
use Apache2::RequestRec ();
use Apache2::RequestIO ();
use Apache2::Filter ();
use Apache::TestTrace;
use TestCommon::Utils ();
use Apache2::Const -compile => qw(OK M_POST);
use constant DEBUG => 1;
sub transparent {
my $filter = shift;
while ($filter->read(my $buffer, 1024)){
debug "transparent buffer: $buffer";
$buffer =~ s/foo//;
$filter->print($buffer);
}
$filter->print("");
Apache2::Const::OK;
}
sub in_adjust { adjust("INPUT", @_)}
sub out_adjust_before_ssi { adjust("OUTPUT", @_)}
sub out_adjust_after_ssi { adjust("REMOVE", @_)}
sub adjust {
my ($string, $filter) = @_;
my $sig = "adjust($string):";
while ($filter->read(my $buffer, 1024)){
debug "$sig before: $buffer";
$buffer =~ s/$string//;
debug "$sig after: $buffer";
$filter->print($buffer);
}
Apache2::Const::OK;
}
sub handler {
my $r = shift;
$r->content_type('text/plain');
if ($r->method_number == Apache2::Const::M_POST) {
$r->print(TestCommon::Utils::read_post($r));
}
return Apache2::Const::OK;
}
1;
__DATA__
<NoAutoConfig>
PerlModule TestFilter::both_str_req_mix
<Location /TestFilter__both_str_req_mix>
Options +Includes
# DEFLATE has a higher priority (AP_FTYPE_CONTENT_SET=20) than
# mod_perl request filters (AP_FTYPE_RESOURCE=10), so it's going
# to filter input first no matter how we insert other mod_perl
# filters. (mod_perl connection filter handlers have an even
# higher priority (AP_FTYPE_PROTOCOL = 30), see
# include/util_filter.h for those definitions).
#
# PerlSetInputFilter is only useful for preserving the
# insertion order of filters with the same priority
SetInputFilter DEFLATE
#PerlInputFilterHandler TestCommon::FilterDebug::snoop_request
PerlInputFilterHandler TestFilter::both_str_req_mix::in_adjust
PerlInputFilterHandler TestFilter::both_str_req_mix::transparent
# here INCLUDES and adjust are both of the same priority
# (AP_FTYPE_RESOURCE), so PerlSetOutputFilter
PerlOutputFilterHandler TestFilter::both_str_req_mix::out_adjust_before_ssi
PerlSetOutputFilter INCLUDES
PerlOutputFilterHandler TestFilter::both_str_req_mix::out_adjust_after_ssi
#PerlOutputFilterHandler TestCommon::FilterDebug::snoop_request
PerlSetOutputFilter DEFLATE
SetHandler modperl
PerlResponseHandler TestFilter::both_str_req_mix
</Location>
</NoAutoConfig>