Dancer2
view release on metacpan or search on metacpan
lib/Dancer2/Core/DSL.pm view on Meta::CPAN
$Dancer2::Core::Route::RESPONSE->status,
$Dancer2::Core::Route::RESPONSE->headers_to_array,
]);
}
eval {
$Dancer2::Core::Route::WRITER->write(@_);
1;
} or do {
my $error = $@ || 'Zombie Error';
$Dancer2::Core::Route::ERROR_HANDLER
? $Dancer2::Core::Route::ERROR_HANDLER->($error)
: $dsl->app->logger_engine->log(
warning => "Error in delayed response: $error"
);
};
}
sub content_type {
shift;
$Dancer2::Core::Route::RESPONSE->content_type(@_);
}
sub delayed {
my ( $dsl, $cb, @args ) = @_;
@args % 2 == 0
or croak 'Arguments to delayed() keyword must be key/value pairs';
# first time, responder doesn't exist yet
my %opts = @args;
$Dancer2::Core::Route::RESPONDER
or return Dancer2::Core::Response::Delayed->new(
cb => $cb,
request => $Dancer2::Core::Route::REQUEST,
response => $Dancer2::Core::Route::RESPONSE,
( error_cb => $opts{'on_error'} )x!! $opts{'on_error'},
);
# we're in an async request process
my $request = $Dancer2::Core::Route::REQUEST;
my $response = $Dancer2::Core::Route::RESPONSE;
my $responder = $Dancer2::Core::Route::RESPONDER;
my $writer = $Dancer2::Core::Route::WRITER;
my $handler = $Dancer2::Core::Route::ERROR_HANDLER;
return sub {
local $Dancer2::Core::Route::REQUEST = $request;
local $Dancer2::Core::Route::RESPONSE = $response;
local $Dancer2::Core::Route::RESPONDER = $responder;
local $Dancer2::Core::Route::WRITER = $writer;
local $Dancer2::Core::Route::ERROR_HANDLER = $handler;
$cb->(@_);
};
}
sub flush {
my $responder = $Dancer2::Core::Route::RESPONDER
or croak 'flush() called outside streaming response';
my $response = $Dancer2::Core::Route::RESPONSE;
$Dancer2::Core::Route::WRITER = $responder->([
$response->status, $response->headers_to_array,
]);
}
sub done {
my $writer = $Dancer2::Core::Route::WRITER
or croak 'done() called outside streaming response';
$writer->close;
}
sub pass { shift->app->pass }
#
# Route handler helpers
#
sub context {
Carp::croak "DEPRECATED: context keyword. Please use the 'app' keyword instead of 'context'";
}
sub request { $Dancer2::Core::Route::REQUEST }
sub request_header { shift; $Dancer2::Core::Route::REQUEST->headers->header(@_) }
sub response { $Dancer2::Core::Route::RESPONSE }
sub upload { shift; $Dancer2::Core::Route::REQUEST->upload(@_); }
sub captures { $Dancer2::Core::Route::REQUEST->captures }
sub uri_for { shift; $Dancer2::Core::Route::REQUEST->uri_for(@_); }
sub uri_for_route { shift->app->uri_for_route(@_); }
sub splat { $Dancer2::Core::Route::REQUEST->splat }
sub params { shift; $Dancer2::Core::Route::REQUEST->params(@_); }
sub param { shift; $Dancer2::Core::Route::REQUEST->param(@_); }
sub query_parameters { shift; $Dancer2::Core::Route::REQUEST->query_parameters(@_); }
sub body_parameters { shift; $Dancer2::Core::Route::REQUEST->body_parameters(@_); }
sub route_parameters { shift; $Dancer2::Core::Route::REQUEST->route_parameters(@_); }
sub request_data { shift; $Dancer2::Core::Route::REQUEST->body_data(@_); }
sub redirect { shift->app->redirect(@_) }
sub forward { shift->app->forward(@_) }
sub vars { $Dancer2::Core::Route::REQUEST->vars }
sub var { shift; $Dancer2::Core::Route::REQUEST->var(@_); }
sub cookies { $Dancer2::Core::Route::REQUEST->cookies }
sub cookie { shift->app->cookie(@_) }
sub mime {
my $self = shift;
if ( $self->app ) {
return $self->app->mime_type;
}
else {
my $runner = $self->runner;
$runner->mime_type->reset_to_default;
return $runner->mime_type;
( run in 1.154 second using v1.01-cache-2.11-cpan-39bf76dae61 )