has
_header_buf
=> (
is
=>
'rw'
,
clearer
=>
'_clear_header_buf'
,
predicate
=>
'_has_header_buf'
);
sub
finalize_headers {
my
(
$self
,
$c
) =
@_
;
$c
->response->header(
Status
=>
$c
->response->status );
$self
->_header_buf(
$c
->response->headers->as_string(
"\015\012"
) .
"\015\012"
);
}
sub
prepare_connection {
my
(
$self
,
$c
) =
@_
;
local
(
*ENV
) =
$self
->env || \
%ENV
;
my
$request
=
$c
->request;
$request
->address(
$ENV
{REMOTE_ADDR} );
PROXY_CHECK:
{
unless
(
ref
(
$c
)->config->{using_frontend_proxy} ) {
last
PROXY_CHECK
if
$ENV
{REMOTE_ADDR} ne
'127.0.0.1'
;
last
PROXY_CHECK
if
ref
(
$c
)->config->{ignore_frontend_proxy};
}
last
PROXY_CHECK
unless
$ENV
{HTTP_X_FORWARDED_FOR};
my
(
$ip
) =
$ENV
{HTTP_X_FORWARDED_FOR} =~ /([^,\s]+)$/;
$request
->address(
$ip
);
if
(
defined
$ENV
{HTTP_X_FORWARDED_PORT} ) {
$ENV
{SERVER_PORT} =
$ENV
{HTTP_X_FORWARDED_PORT};
}
}
$request
->hostname(
$ENV
{REMOTE_HOST} )
if
exists
$ENV
{REMOTE_HOST};
$request
->protocol(
$ENV
{SERVER_PROTOCOL} );
$request
->user(
$ENV
{REMOTE_USER} );
$request
->remote_user(
$ENV
{REMOTE_USER} );
$request
->method(
$ENV
{REQUEST_METHOD} );
if
(
$ENV
{HTTPS} &&
uc
(
$ENV
{HTTPS} ) eq
'ON'
) {
$request
->secure(1);
}
if
(
$ENV
{SERVER_PORT} == 443 ) {
$request
->secure(1);
}
binmode
(STDOUT);
}
sub
prepare_headers {
my
(
$self
,
$c
) =
@_
;
local
(
*ENV
) =
$self
->env || \
%ENV
;
my
$headers
=
$c
->request->headers;
foreach
my
$header
(
keys
%ENV
) {
next
unless
$header
=~ /^(?:HTTP|CONTENT|COOKIE)/i;
(
my
$field
=
$header
) =~ s/^HTTPS?_//;
$headers
->header(
$field
=>
$ENV
{
$header
} );
}
}
sub
prepare_path {
my
(
$self
,
$c
) =
@_
;
local
(
*ENV
) =
$self
->env || \
%ENV
;
my
$scheme
=
$c
->request->secure ?
'https'
:
'http'
;
my
$host
=
$ENV
{HTTP_HOST} ||
$ENV
{SERVER_NAME};
my
$port
=
$ENV
{SERVER_PORT} || 80;
my
$script_name
=
$ENV
{SCRIPT_NAME};
$script_name
=~ s/([^
$URI::uric
])/
$URI::Escape::escapes
{$1}/go
if
$script_name
;
my
$base_path
;
if
(
exists
$ENV
{REDIRECT_URL} ) {
$base_path
=
$ENV
{REDIRECT_URL};
$base_path
=~ s/
$ENV
{PATH_INFO}$//;
}
else
{
$base_path
=
$script_name
||
'/'
;
}
PROXY_CHECK:
{
unless
(
ref
(
$c
)->config->{using_frontend_proxy} ) {
last
PROXY_CHECK
if
$host
!~ /localhost|127.0.0.1/;
last
PROXY_CHECK
if
ref
(
$c
)->config->{ignore_frontend_proxy};
}
last
PROXY_CHECK
unless
$ENV
{HTTP_X_FORWARDED_HOST};
$host
=
$ENV
{HTTP_X_FORWARDED_HOST};
$port
=
$c
->request->secure ? 443 : 80;
if
(
$ENV
{HTTP_X_FORWARDED_PORT} ) {
$port
=
$ENV
{HTTP_X_FORWARDED_PORT};
}
}
my
$path_info
=
$ENV
{PATH_INFO};
if
(
my
$req_uri
=
$ENV
{REQUEST_URI}) {
$req_uri
=~ s/^\Q
$base_path
\E//;
$req_uri
=~ s/\?.*$//;
if
(
$req_uri
) {
if
(
substr
(
$req_uri
, 0, 1) ne
'/'
) {
my
(
$match
) =
$req_uri
=~ m|^([^/]+)|;
my
(
$path_info_part
) =
$path_info
=~ m|^(.*?\Q
$match
\E)|;
substr
(
$req_uri
, 0,
length
(
$match
),
$path_info_part
)
if
$path_info_part
;
}
$path_info
=
$req_uri
;
}
}
my
$path
=
$base_path
. (
$path_info
||
''
);
$path
=~ s{^/+}{};
my
$uri_class
=
"URI::$scheme"
;
$host
=~ s/:(?:80|443)$//;
if
(
$port
!~ /^(?:80|443)$/ &&
$host
!~ /:/ ) {
$host
.=
":$port"
;
}
$path
=~ s/([^
$URI::uric
])/
$URI::Escape::escapes
{$1}/go;
$path
=~ s/\?/%3F/g;
my
$query
=
$ENV
{QUERY_STRING} ?
'?'
.
$ENV
{QUERY_STRING} :
''
;
my
$uri
=
$scheme
.
'://'
.
$host
.
'/'
.
$path
.
$query
;
$c
->request->uri(
bless
(\
$uri
,
$uri_class
)->canonical );
$base_path
.=
'/'
unless
$base_path
=~ m{/$};
my
$base_uri
=
$scheme
.
'://'
.
$host
.
$base_path
;
$c
->request->base(
bless
\
$base_uri
,
$uri_class
);
}
around
prepare_query_parameters
=>
sub
{
my
$orig
=
shift
;
my
(
$self
,
$c
) =
@_
;
local
(
*ENV
) =
$self
->env || \
%ENV
;
if
(
$ENV
{QUERY_STRING} ) {
$self
->
$orig
(
$c
,
$ENV
{QUERY_STRING} );
}
};
sub
prepare_request {
my
(
$self
,
$c
,
%args
) =
@_
;
if
(
$args
{env} ) {
$self
->env(
$args
{env} );
}
}
around
prepare_write
=>
sub
{
*STDOUT
->autoflush(1);
return
shift
->(
@_
);
};
around
write
=>
sub
{
my
$orig
=
shift
;
my
(
$self
,
$c
,
$buffer
) =
@_
;
if
(
$self
->_has_header_buf ) {
$buffer
=
$self
->_clear_header_buf .
$buffer
;
}
return
$self
->
$orig
(
$c
,
$buffer
);
};
sub
read_chunk {
shift
;
shift
;
*STDIN
->
sysread
(
@_
); }
sub
run {
shift
;
shift
->handle_request(
env
=> \
%ENV
) }
no
Moose;
1;