Added perl environment (#311)

Perl runtime environment and example function.
This commit is contained in:
Moritz Grosch (LittleFox)
2017-09-07 23:42:40 -07:00
committed by Soam Vasani
parent 1b9fa5bc30
commit 6142ac3648
4 changed files with 103 additions and 0 deletions
+9
View File
@@ -0,0 +1,9 @@
FROM perl:latest
RUN cpanm -n Twiggy Getopt::Args Dancer2
COPY server.pl /server.pl
WORKDIR /
EXPOSE 8888
ENTRYPOINT ["/server.pl"]
+30
View File
@@ -0,0 +1,30 @@
# Fission Perl environment
This is an environment to execute perl code.
It is implemented using the lightweight web application framework
[Dancer2](https://metacpan.org/pod/Dancer2) and the async I/O webserver
[Twiggy](https://metacpan.org/pod/Twiggy).
Since Twiggy is implemented with [AnyEvent](https://metacpan.org/pod/AnyEvent),
you can write async code using AnyEvent in your function.
## Usage
The function you upload is actually a perl package returning a coderef (see the
example).
You can use other packages and add more subs, but only the coderef you returned
from the package is executed directly.
Your main-function gets exactly one argument: the Dancer2 request object. You
may want to `use Dancer2` to get functions like `send_error`.
## Example
```perl
# hello.pm
return sub {
return 'Hello, Perl!';
}
```
+46
View File
@@ -0,0 +1,46 @@
#!/usr/bin/env perl
use utf8;
use strict;
use warnings;
use Getopt::Args;
use Plack::Handler::Twiggy;
opt codepath => (
isa => 'Str',
default => '/userfunc/user',
comment => 'Path to the user code',
);
opt port => (
isa => 'Int',
default => 8888,
comment => 'Port to listen on',
);
my $options = optargs();
{
package App::Fission::Perl;
use Dancer2;
our $userfunc;
post '/specialize' => sub {
if($userfunc) {
send_error('Not a generic container', 400);
}
$userfunc = require($options->{codepath});
return '';
};
any '/' => sub {
return $userfunc ? $userfunc->(request) : send_error('Not yet specialized', 500);
};
}
my $handler = Plack::Handler::Twiggy->new(port => $options->{port});
$handler->run(App::Fission::Perl->to_app);