package My::RouteHandler;
use Dancer;
use Path::Tiny;
use Data::GUID;
use Time::Piece;
...
post '/some/route' => sub {
my %args = params;
if ( $args{'long_task'} ) {
my $guid = Data::GUID->new->as_string;
my $url = '/files/results/' . $guid . '.html';
my $path = config->app_root . '/app/restricted' . $url;
my $file = path( $path )->touch;
fork and do {
$file->spew( sprintf "Results not ready. Please reload this page in a few minutes.
URL: %s
Created: %s", $url, gmtime->datetime );
return redirect $url;
};
# now we are off line
my $stuff = do_some_lengthy_task();
$file->spew( $stuff );
exit; # because we already forked and returned to the browser
} else {
...
}
};
1;
__END__