AnyEvent-HTTPD-ExtDirect
view release on metacpan or search on metacpan
lib/AnyEvent/HTTPD/ExtDirect.pm view on Meta::CPAN
# Content length should be in octets
my $content_length = do { use bytes; my $len = length $js };
$req->respond([
200,
'OK',
{
'Content-Type' => 'application/javascript',
'Content-Length' => $content_length,
},
$js
]);
$self->stop_request;
}
### PUBLIC INSTANCE METHOD ###
#
# Handle Ext.Direct method requests
#
sub handle_router {
my ($self, $req) = @_;
if ( $req->method ne 'POST' ) {
$req->respond( $self->_error_response );
$self->stop_request;
return;
}
my $config = $self->config;
my $api = $self->api;
# Naked AnyEvent::HTTPD::Request object doesn't provide several
# utility methods we'll need down below, and we will need it as
# an environment object, too
my $env = bless $req, __PACKAGE__.'::Env';
# We're trying to distinguish between a raw POST and a form call
my $router_input = $self->_extract_post_data($env);
# If the extraction fails, undef is returned by the method above
if ( !defined $router_input ) {
$req->respond( $self->_error_response );
$self->stop_request;
return;
}
my $router_class = $config->router_class_anyevent;
eval "require $router_class";
my $router = $router_class->new(
config => $config,
api => $api,
);
# No need for eval here, Router won't throw exceptions
my $result = $router->route($router_input, $env);
# Router result is Plack-compatible arrayref; there's not much
# difference in what AnyEvent::HTTPD expects so we just convert it
# in place
$req->respond([
200,
'OK',
+{ @{ $result->[1] } },
$result->[2]->[0],
]);
$self->stop_request;
}
### PUBLIC INSTANCE METHOD ###
#
# Polls Event handlers for events, returning serialized stream
#
sub handle_events {
my ($self, $req) = @_;
# Only GET and POST methods are supported for polling
my $method = $req->method;
if ( $method ne 'GET' && $method ne 'POST' ) {
$req->respond( $self->_error_response );
$self->stop_request;
return;
}
my $config = $self->config;
my $api = $self->api;
my $env = bless $req, __PACKAGE__.'::Env';
my $provider_class = $config->eventprovider_class_anyevent;
eval "require $provider_class";
my $provider = $provider_class->new(
config => $config,
api => $api,
);
# Polling for Events is safe from exceptions
my $http_body = $provider->poll($env);
my $content_length
= do { no warnings 'void'; use bytes; length $http_body };
$req->respond([
200,
'OK',
{
'Content-Type' => 'application/json; charset=utf-8',
'Content-Length' => $content_length,
},
( run in 2.845 seconds using v1.01-cache-2.11-cpan-5a3173703d6 )