Apache2-CondProxy
view release on metacpan or search on metacpan
lib/Apache2/CondProxy.pm view on Meta::CPAN
package Apache2::CondProxy;
use 5.010;
use strict;
use warnings FATAL => 'all';
use Apache2::RequestRec ();
use Apache2::RequestUtil ();
use Apache2::ServerRec ();
use Apache2::SubRequest ();
use Apache2::Response ();
use Apache2::Filter ();
use Apache2::Connection ();
use Apache2::Log ();
use Apache2::ModSSL ();
use APR::Table ();
use APR::Bucket ();
use APR::Brigade ();
use APR::BucketType ();
use Apache2::Const -compile => qw(OK DECLINED SERVER_ERROR PROXYREQ_REVERSE);
use APR::Const -compile => qw(:common ENOTIMPL OVERLAP_TABLES_SET);
use Path::Class ();
use File::Spec ();
use File::Temp ();
use URI ();
use URI::Escape ();
# constants for pnotes
use constant BRIGADE => __PACKAGE__ . '::BRIGADE';
use constant INPUT => __PACKAGE__ . '::INPUT';
use constant CACHE => __PACKAGE__ . '::CACHE';
my $TRUE = qr/^\s*(1|true|on|yes)\s*$/i;
BEGIN {
# Stopgap implementation of ap_save_brigade. This is almost
# exactly what the C version looks like in server/util_filter.c.
unless (Apache2::Filter->can('save_brigade')) {
*Apache2::Filter::save_brigade = sub {
my ($f, $saveto, $bb, $pool) = @_;
# XXX should this be $f->r->pool?
$pool ||= $f->c->pool;
my $ret = APR::Const::SUCCESS;
for (my $b = $bb->first; $b && !$b->is_eos; $b = $bb->next($b)) {
my $rv = $b->setaside($pool);
if ($rv == APR::Const::ENOTIMPL) {
my $len = $b->read(my $data);
# apparently this changes the bucket type?
$rv = $b->setaside($pool) if $len;
}
# check for some other kind of error
if ($rv != APR::Const::SUCCESS) {
$ret = $rv;
return $rv if $rv != APR::Const::ENOTIMPL;
}
}
# now concatenate the brigade to the target
$saveto->concat($bb);
return $ret;
};
}
}
# if i recall correctly, mod_perl doesn't like 'use base'.
our @ISA = qw(Apache2::RequestRec);
=head1 NAME
Apache2::CondProxy - Intelligent reverse proxy for missing resources
=head1 VERSION
Version 0.17
=cut
our $VERSION = '0.17';
=head1 SYNOPSIS
# httpd.conf
PerlFixupHandler Apache2::CondProxy
PerlSetVar ProxyTarget http://another.host/
PerlSetVar RequestBodyCache /tmp
PerlSetVar MatchScheme on
=head1 DESCRIPTION
This module performs the logic required to achieve what is implied by
the following Apache configuration:
( run in 2.097 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )