Apache2-CondProxy
view release on metacpan or search on metacpan
lib/Apache2/CondProxy.pm view on Meta::CPAN
# don't let it redirect to itself
my $uri = URI->new_abs($r->unparsed_uri, $host);
if ($uri->eq($loc)) {
$r->headers_out->unset('Location');
}
else {
$r->headers_out->set(Location => $loc->as_string);
}
}
}
}
sub _response_handler {
my $r = shift;
#$r->log->debug('lol response handler');
Apache2::Const::OK;
}
sub _cleanup_handler {
my $r = shift;
if (my $xx = $r->pnotes(INPUT)) {
$r->log->debug
('Unlinking temporary file in case it is still sticking around');
unlink($xx->[0]);
}
Apache2::Const::OK;
}
sub _input_filter_tee {
my ($f, $bb, $mode, $block, $readbytes) = @_;
my $c = $f->c;
my $r = $f->r;
my $mainr = $r->main || $r;
$r->log->debug('Pre-emptively storing request input');
my $in = APR::Brigade->new($c->pool, $c->bucket_alloc);
my $rv = $f->next->get_brigade($in, $mode, $block, $readbytes);
return $rv unless $rv == APR::Const::SUCCESS;
# only open the tempfile if there is something to put in it
unless ($in->is_empty) {
# deal with tempfile
my $fh;
my $xx = $mainr->pnotes(INPUT);
if ($xx) {
$fh = $xx->[1];
}
else {
# unfortunately something does not like the preemptive unlink
my $dir = $mainr->pnotes(CACHE);
my $fn;
eval { ($fh, $fn) = $dir->tempfile(OPEN => 1, UNLINK => 0) };
if ($@) {
$r->log->crit("Could not create temporary file in $dir: $@");
return Apache2::Const::SERVER_ERROR;
}
$fh->binmode;
# also yes I know this is the reverse of what File::Temp returns
$mainr->pnotes(INPUT, [$fn, $fh]);
}
for (my $b = $in->first; $b; $b = $in->next($b)) {
if ($b->is_eos) {
# flush the temp file and seek it to zero
$fh->flush;
$fh->seek(0, 0);
}
elsif (my $len = $b->read(my $data)) {
$fh->write($data);
}
else {
# noop?
}
}
}
$bb->concat($in);
APR::Const::SUCCESS;
}
# it kinda sucks there's no way to make file buckets in mod_perl
# because this would probably be way more efficient to stick the fd in
# a bucket than read the file out in perl.
sub _input_filter_replay {
my ($f, $bb, $mode, $block, $readbytes) = @_;
my $c = $f->c;
my $r = $f->r;
my $xx = $r->pnotes(INPUT) or return Apache2::Const::DECLINED;
my ($fn, $fh) = @$xx;
$r->log->debug('Replaying input into proxy request');
# XXX do i even have to do this?
my $in = APR::Brigade->new($c->pool, $c->bucket_alloc);
my $rv = $f->next->get_brigade($in, $mode, $block, $readbytes);
return $rv unless $rv == APR::Const::SUCCESS;
# whatever is in it, empty it
$in->destroy;
# get the data out of the file
my $len = $fh->read(my $data, $readbytes);
if ($len) {
$r->log->debug
("Replaying $len bytes from $fn (Block size: $readbytes)");
my $b = APR::Bucket->new($c->bucket_alloc, $data);
$bb->insert_tail($b);
# eos if there's nothing left to read, flush otherwise
if ($fh->eof) {
$r->log->debug('End of file, appending EOS bucket');
$bb->insert_tail(APR::Bucket::eos_create($c->bucket_alloc));
unlink($fn);
}
else {
$bb->insert_tail(APR::Bucket::flush_create($c->bucket_alloc));
( run in 1.871 second using v1.01-cache-2.11-cpan-39bf76dae61 )