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 )