AnyEvent-Plackup
view release on metacpan or search on metacpan
lib/AnyEvent/Plackup.pm view on Meta::CPAN
my $app = $self->{app} || $self->_mk_default_app;
my $twiggy = Twiggy::Server->new(
port => $self->{port} || empty_port(),
%{ $self->{args} || {} },
server_ready => sub {
my $args = shift;
$self->{host} = $args->{host};
$self->{port} = $args->{port};
$self->ready_cv->send($args);
}
);
$twiggy->register_service($app);
$self->{twiggy} = $twiggy;
}
sub _mk_default_app {
my $self = shift;
$self->{request_cv} = AE::cv;
$self->{request_queue} = [];
weaken $self;
require AnyEvent::Plackup::Request;
return sub {
my ($env) = @_;
my $req = AnyEvent::Plackup::Request->new($env);
push @{ $self->{request_queue} }, $req;
$self->{request_cv}->send if $self->{request_cv};
return sub {
my $respond = shift;
$req->_response_cv->cb(sub {
my $res = $_[0]->recv;
if (ref $res eq 'CODE') {
$res->($respond);
} else {
$respond->($res);
}
});
};
};
}
sub DESTROY {
my $self = shift;
local $@;
delete $self->{twiggy}->{listen_guards};
}
sub shutdown {
my $self = shift;
my $w; $w = AE::timer 0, 0, sub {
$self->{twiggy}->{exit_guard}->end;
undef $w;
};
$self->{twiggy}->{exit_guard}->recv;
}
1;
__END__
=head1 NAME
AnyEvent::Plackup - Easily establish an HTTP server inside a program
=head1 SYNOPSIS
use AnyEvent::Plackup;
my $server = plackup(); # port is automatically chosen
my $req = $server->recv; # isa Plack::Request
my $value = $req->parameters->{foo};
$req->respond([ 200, [], [ 'OK' ] ]);
# or specify PSGI app:
my $server = plackup(app => \&app);
=head1 DESCRIPTION
AnyEvent::Plackup provides functionality of establishing an HTTP server inside a program using L<Twiggy>. If not specified, open port is automatically chosen.
=head1 FUNCTIONS
=over 4
=item C<< my $server = AnyEvent::Plackup->new([ app => \&app, port => $port, %args ]) >>
=item C<< my $server = plackup([ app => \&app, port => $port, %args ]) >>
Creates and starts an HTTP server. Internally calls C<new> and C<run>.
If I<app> is not specified, C<< $server->recv >> is available and you should respond this manually.
=item C<< my $req = $server->recv >>
Waits until next request comes. Returns an C<AnyEvent::Plackup::Request> (isa C<Plack::Request>).
=item C<< my $origin = $server->origin >>
=item C<< my $origin = "$server" >>
Returns server's origin. e.g. C<"http://0.0.0.0:8290">.
=item C<< $server->shutdown >>
Shuts down the server immediately.
=back
( run in 0.675 second using v1.01-cache-2.11-cpan-39bf76dae61 )