Apache-ProxyRewrite
view release on metacpan or search on metacpan
ProxyRewrite.pm view on Meta::CPAN
}
$r->log->debug("handler: Remote Site - $remote_site");
$r->log->debug("handler: Remote Location - $remote_location");
$r->log->debug("handler: Auth Info - $auth_info");
foreach my $map (keys(%mappings)) {
# Standardize host on lowercase
if ($map =~ m!([^:]+://)([^/]+)(.*)!) {
my $mapping = $mappings{$map};
delete $mappings{$map};
my ($protocol, $url_host, $uri) = ($1, $2, $3);
$url_host =~ tr/A-Z/a-z/;
$map = $protocol . $url_host . $uri;
$mappings{$map} = $mapping;
}
$r->log->debug("handler: Mapping $map to $mappings{$map}");
}
# fetch URL
$r->log->info("ProxyRewrite: Preparing to fetch ", $r->uri,
" at time ", time);
my $response = &fetch($r, $remote_location, $remote_site,
$auth_info, \%mappings);
# rewrite response URIs as needed
$r->log->info("ProxyRewrite: Preparing to rewrite URIs for ", $r->uri,
" at time ", time);
if ($response->header('Content-type') =~ m!^text/html!) {
&parse($r, $remote_site, $response, \%mappings);
}
# respond to client
$r->log->info("ProxyRewrite: Preparing to respond for ", $r->uri,
" at time ", time);
&respond($r, $remote_site, $remote_location, $auth_redirect,
$response, \%mappings);
return OK;
}
###############################################################################
###############################################################################
# fetch: fetch the remote URL and return a reference to the response object
###############################################################################
###############################################################################
sub fetch {
my ($r, $remote_location, $remote_site, $auth_info, $mapref) = @_;
my $client_agent = '';
my $my_uri = '';
my ($k, $v);
my $base = $r->location();
my $args = $r->args();
if ($base ne '/') {
($my_uri = $r->uri) =~ s/^$base//;
} else {
$my_uri = $r->uri;
}
$my_uri = $remote_location . $my_uri;
$my_uri .= '?' . $r->args() if $args;
my $request = HTTP::Request->new($r->method, $my_uri);
$r->log->info("ProxyRewrite::fetch: Time proxy request method created: ", time);
$r->log->debug("fetch: Base URI (aka location section): $base");
$r->log->info("ProxyRewrite::fetch: Request for $my_uri with method ", $r->method);
my(%headers_in) = $r->headers_in;
while(($k,$v) = each %headers_in) {
# HACK to force no Keep-Alives on the connection between proxy
# and remote server
$r->log->debug("fetch: IN $k: $v");
if ($k =~ /Connection/) {
$v = "Close";
} elsif ($k =~ /Host/) {
($v) = ($remote_location =~ m!://([^/]+)!);
} elsif ($k =~ /User-Agent/) {
$client_agent = $v;
}
$v = uri_unescape($v);
$request->header($k,$v);
$r->log->debug("fetch: IN-MOD $k: $v");
}
# If we have authorization information and it isn't already filled in
if ($auth_info && !$request->authorization()) {
$request->authorization($auth_info);
}
if ($r->method eq "POST") {
my $content;
if ($r->headers_in->{'Content-type'} eq 'application/x-www-form-urlencoded') {
$content = $r->content;
} else {
$r->read($content, $r->headers_in->{'Content-length'});
}
$request->content($content);
$r->log->debug("fetch: Request type: ", $r->method);
$r->log->debug("fetch: Request content type: ",
$r->headers_in->{'Content-type'});
$r->log->debug("fetch: Request content: $content");
}
$r->log->debug("fetch: Product: $Apache::ProxyRewrite::PRODUCT");
my $ua = new LWP::UserAgent;
if ($client_agent ne '') {
$ua->agent("$client_agent; $Apache::ProxyRewrite::PRODUCT");
} else {
$ua->agent("$Apache::ProxyRewrite::PRODUCT");
}
my $res = $ua->simple_request($request);
$r->log->info("ProxyRewrite::fetch: Time proxy got document: ", time);
$r->log->info("ProxyRewrite::fetch: Original document size: ",
length($res->content));
return($res);
}
###############################################################################
###############################################################################
# parse: parse HTML and find all embedded URLs
###############################################################################
( run in 0.622 second using v1.01-cache-2.11-cpan-39bf76dae61 )