builder
=>
'NoEnv'
,
writer
=> {
response_line
=> 1,
}
;
has
host
=> (
is
=>
'ro'
,
isa
=>
'Str'
,
default
=>
'127.0.0.1'
,
);
has
port
=> (
is
=>
'ro'
,
isa
=>
'Int'
,
required
=> 1,
);
has
net_server
=> (
is
=>
'ro'
,
isa
=>
'Str | Undef'
,
default
=>
undef
,
);
has
net_server_configure
=> (
is
=>
'ro'
,
isa
=>
'HashRef'
,
default
=>
sub
{ +{} },
);
has
print_banner
=> (
is
=>
'ro'
,
isa
=>
'CodeRef'
,
required
=> 1,
default
=>
sub
{
sub
{
my
$self
=
shift
;
print
( __PACKAGE__
.
" : You can connect to your server at "
.
"http://"
. (
$self
->host ||
'localhost'
) .
":"
.
$self
->port
.
"/\n"
);
} }
);
sub
run {
my
(
$self
, ) =
@_
;
my
$headers
;
my
%setup
;
my
$server
;
$server
= any_moose(
'::Meta::Class'
)
->create_anon_class(
superclasses
=> [
'HTTP::Server::Simple'
],
methods
=> {
setup
=>
sub
{
shift
;
$headers
= HTTP::Headers::Fast->new;
%setup
=
@_
;
},
headers
=>
sub
{
my
(
$self
,
$args
) =
@_
;
$headers
->header(
@$args
)
if
@$args
;
},
handler
=>
sub
{
my
(
$host
,
$port
) =
$headers
->header(
'Host'
) ?
split
(
':'
,
$headers
->header(
'Host'
)) :(
$setup
{localname},
$setup
{localport});
$base
.=
":$port"
if
$port
;
my
$request_uri
=
$setup
{request_uri};
$request_uri
=
'/'
if
$request_uri
=~ m!^https?://!i;
my
$uri
= URI::WithBase->new(
$base
.
$request_uri
,
$base
.
'/'
,
);
$self
->handle_request(
uri
=>
$uri
,
connection_info
=> {
method
=>
$setup
{method},
protocol
=>
$setup
{protocol},
address
=>
$setup
{peeraddr},
port
=>
$setup
{localport},
user
=>
undef
,
_https_info
=>
undef
,
request_uri
=>
$setup
{request_uri},
},
headers
=>
$headers
,
_connection
=> {
env
=> {},
input_handle
=> \
*STDIN
,
output_handle
=> \
*STDOUT
,
},
)
},
net_server
=>
sub
{
$self
->net_server },
print_banner
=>
sub
{
$self
->print_banner->(
$self
) },
},
cache
=> 1
)->name->new(
$self
->port
);
$server
->host(
$self
->host);
$server
->run(%{
$self
->net_server_configure });
}
__INTERFACE__