Apache-ACEProxy
view release on metacpan or search on metacpan
lib/Apache/ACEProxy.pm view on Meta::CPAN
package Apache::ACEProxy;
use strict;
use vars qw($VERSION);
$VERSION = 0.04;
use Apache::Constants qw(:response);
use LWP::UserAgent;
use URI;
sub handler($$) {
my($class, $r) = @_;
return DECLINED unless $r->proxyreq;
$r->handler('perl-script');
$r->set_handlers(PerlHandler => [ sub { $class->proxy_handler($r); } ]);
return OK;
}
sub proxy_handler {
my($class, $r) = @_;
my $request = HTTP::Request->new($r->method, $r->uri);
my %headers_in = $r->headers_in;
while(my($key, $val) = each %headers_in) {
$request->header($key, $val);
}
if ($r->method eq 'POST') {
$request->content(scalar $r->content);
}
# URI & Host: header conversion
$class->prepare_ace($r, $request);
my $res = LWP::UserAgent->new->simple_request($request);
$r->content_type($res->header('Content-type'));
$r->status($res->code);
$r->status_line($res->status_line);
my $table = $r->headers_out;
$res->scan(sub { $table->add(@_); });
$r->send_http_header();
$r->print($res->content);
return OK;
}
sub prepare_ace {
my($class, $r, $request) = @_;
# no ACE conversion
return if $r->uri =~ /^[\x30-\x39\x41-\x5a\x61-\x7a\x2d\.]*$/;
# Encode hostname to ACE
my $uri = URI->new($r->uri);
my $ace_host;
eval {
$ace_host = join '.', map {
# RFC 1035: letter, digit, hyphen
/^[\x30-\x39\x41-\x5a\x61-\x7a\x2d]*$/ ?
$_ : $class->encode($_);
} split /\./, $uri->host;
};
if ($@) {
(my $exception = $@) =~ s/ at .*$//; chomp $exception;
require Apache::Log;
$r->log->error("Apache::ACEProxy: error happens while ACE conversion: $exception");
return;
}
# set ACEd hostname in the request
$uri->host($ace_host);
$request->uri($uri);
$request->header(Host => $ace_host);
}
sub encode {
my($class, $domain) = @_;
# Default to UTF8_RACE
require Apache::ACEProxy::UTF8_RACE;
Apache::ACEProxy::UTF8_RACE->encode($domain);
( run in 1.084 second using v1.01-cache-2.11-cpan-39bf76dae61 )