PTION
This app will fork a ruby process that can handle rack requests.
Requests are converted to JSON and sent over a unix socket as a
netstring, a response is then read and used as the psgi response
package Plack::App::Prack::Response;
use strict;
use warnings;
use JSON;
sub new {
my ($class, $sock) = @_;
die "socket is required" unless $sock;
my $self = bless { sock => $sock }, $class
de_json $self->read_ns;
$self->{body} = [];
while (my $chunk = $self->read_ns) {
push @{$self->{body}}, $chunk;
}
$self->{sock}->shutdown(0);
}
sub handle_error {
my ($self, $json)
= @_;
my $stack = decode_json $json;
die join "\n", map {$stack->{$_}} qw/name message stack/;
}
sub headers {
my $self = shift;
if ($self->{headers}) {
return [ %{$self->{headers}} ];
package Plack::App::Prack::Request;
use strict;
use warnings;
use JSON;
use Plack::App::Prack::Response;
my @ENV_KEYS = qw/REQUEST_METHOD PATH_INFO QUERY_STRING
SERVER_NAME SERVE
ift;
return length($data).":".$data.",";
}
sub write {
my $self = shift;
my $env = encode_json($self->_filter_env($self->{env}));
my $input = "";
my $buf = "";
while ($self->{env}->{'p
ck::App::Prack::Worker;
use strict;
use warnings;
use Time::HiRes;
use File::Temp ':POSIX';
use JSON;
use IO::Socket::UNIX;
use Plack::App::Prack::Request;
my $NACK = 'Nack::Server.run(ARGV[0], :fi
= $sock->getline;
# could be a stack trace
if ($p !~ /^\d+$/) {
my $stack = decode_json $p;
die "$stack->{name}: $stack->{message}";
}
$self->{sock} = $sock;
$self->{