Catalyst-Engine-Apache
view release on metacpan or search on metacpan
lib/Catalyst/Engine/Apache.pm view on Meta::CPAN
package Catalyst::Engine::Apache;
BEGIN {
$Catalyst::Engine::Apache::AUTHORITY = 'cpan:BOBTFISH';
}
BEGIN {
$Catalyst::Engine::Apache::VERSION = '1.16';
}
# ABSTRACT: Catalyst Apache Engines
use strict;
use warnings;
use base 'Catalyst::Engine';
use File::Spec;
use URI;
use URI::http;
use URI::https;
use constant MP2 => (
exists $ENV{MOD_PERL_API_VERSION} and
$ENV{MOD_PERL_API_VERSION} >= 2
);
__PACKAGE__->mk_accessors(qw/apache return/);
sub prepare_request {
my ( $self, $c, $r ) = @_;
$self->apache( $r );
$self->return( undef );
}
sub prepare_connection {
my ( $self, $c ) = @_;
$c->request->address( $self->apache->connection->remote_ip );
PROXY_CHECK:
{
my $headers = $self->apache->headers_in;
unless ( $c->config->{using_frontend_proxy} ) {
last PROXY_CHECK if $c->request->address ne '127.0.0.1';
last PROXY_CHECK if $c->config->{ignore_frontend_proxy};
}
last PROXY_CHECK unless $headers->{'X-Forwarded-For'};
# If we are running as a backend server, the user will always appear
# as 127.0.0.1. Select the most recent upstream IP (last in the list)
my ($ip) = $headers->{'X-Forwarded-For'} =~ /([^,\s]+)$/;
$c->request->address( $ip );
}
$c->request->hostname( $self->apache->connection->remote_host );
$c->request->protocol( $self->apache->protocol );
$c->request->user( $self->apache->user );
$c->request->remote_user( $self->apache->user );
# when config options are set, check them here first
if ($INC{'Apache2/ModSSL.pm'}) {
$c->request->secure(1) if $self->apache->connection->is_https;
} else {
my $https = $self->apache->subprocess_env('HTTPS');
$c->request->secure(1) if defined $https and uc $https eq 'ON';
}
}
sub prepare_query_parameters {
my ( $self, $c ) = @_;
if ( my $query_string = $self->apache->args ) {
$self->SUPER::prepare_query_parameters( $c, $query_string );
}
}
sub prepare_headers {
my ( $self, $c ) = @_;
$c->request->method( $self->apache->method );
if ( my %headers = %{ $self->apache->headers_in } ) {
$c->request->header( %headers );
}
}
sub prepare_path {
my ( $self, $c ) = @_;
my $scheme = $c->request->secure ? 'https' : 'http';
my $host = $self->apache->hostname || 'localhost';
my $port = $self->apache->get_server_port;
# If we are running as a backend proxy, get the true hostname
PROXY_CHECK:
{
unless ( $c->config->{using_frontend_proxy} ) {
last PROXY_CHECK if $host !~ /localhost|127.0.0.1/;
last PROXY_CHECK if $c->config->{ignore_frontend_proxy};
}
last PROXY_CHECK unless $c->request->header( 'X-Forwarded-Host' );
$host = $c->request->header( 'X-Forwarded-Host' );
if ( $host =~ /^(.+):(\d+)$/ ) {
$host = $1;
$port = $2;
} else {
# backend could be on any port, so
# assume frontend is on the default port
( run in 1.401 second using v1.01-cache-2.11-cpan-39bf76dae61 )