Plack-App-WebSocket
view release on metacpan or search on metacpan
lib/Plack/App/WebSocket.pm view on Meta::CPAN
my ($responder, $psgi_res) = @_;
if(ref($psgi_res) eq "CODE") {
$psgi_res->($responder);
}else {
$responder->($psgi_res);
}
}
sub call {
my ($self, $env) = @_;
if(!$env->{"psgi.streaming"} || !$env->{"psgi.nonblocking"} || !$env->{"psgix.io"}) {
$env->{$ERROR_ENV} = "not supported by the PSGI server";
return $self->{on_error}->($env);
}
my $cv_conn = $self->{websocket_server}->establish_psgi($env, $env->{"psgix.io"});
return sub {
my $responder = shift;
$cv_conn->cb(sub {
my ($cv_conn) = @_;
my ($conn, @handshake_results, $error);
try {
lib/Plack/App/WebSocket.pm view on Meta::CPAN
=head2 Prerequisites
To use L<Plack::App::WebSocket>, your L<PSGI> server must meet the following requirements.
(L<Twiggy> meets all of them, for example)
=over
=item *
C<psgi.streaming> environment is true.
=item *
C<psgi.nonblocking> environment is true, and the server supports L<AnyEvent>.
=item *
C<psgix.io> environment holds a valid raw IO socket object. See L<PSGI::Extensions>.
=back
t/testlib/Error.pm view on Meta::CPAN
my %base = (on_establish => sub {
fail("should not be established.");
});
my %apps = (
default => Plack::App::WebSocket->new(%base),
custom => Plack::App::WebSocket->new(%base, on_error => sub {
my ($env) = @_;
my $message = "custom error: " . $env->{"plack.app.websocket.error"} . ", " . _str($env->{"plack.app.websocket.error.handshake"});
return [200, ["Content-Type", "text/plain", "Content-Length", length($message)], [$message]];
}),
streaming => Plack::App::WebSocket->new(%base, on_error => sub {
my ($env) = @_;
return sub {
my $responder = shift;
my $message = "error (streaming res): " . $env->{"plack.app.websocket.error"}. ", " . _str($env->{"plack.app.websocket.error.handshake"});
$responder->([200, ["Content-Type", "text/plain", "Content-Length", length($message)], [$message]]);
};
})
);
return sub {
my ($env) = @_;
die "Unexpected request path" if $env->{PATH_INFO} !~ m{^/([^/]+)/?(.*)};
my ($app_type, $option) = ($1, $2);
my $app = $apps{$app_type};
die "Unknown app type: $app_type" if not defined $app;
t/testlib/Error.pm view on Meta::CPAN
sub run_tests {
my ($server_runner) = @_;
my ($port, $guard) = run_server($server_runner, _create_app());
foreach my $case (
{path => "/default/no_io", exp_status => 500, exp_body => qr/.*/},
{path => "/default/", exp_status => 400, exp_body => qr/.*/},
{path => "/custom/no_io", exp_status => 200, exp_body => qr/^custom error: not supported by the PSGI server, UNDEF$/},
{path => "/custom/", exp_status => 200, exp_body => qr/^custom error: invalid request, handshake error/},
{path => "/streaming/no_io", exp_status => 200, exp_body => qr/^error \(streaming res\): not supported by the PSGI server, UNDEF$/},
{path => "/streaming/", exp_status => 200, exp_body => qr/^error \(streaming res\): invalid request, handshake error/},
) {
my $cv_res = AnyEvent->condvar;
http_get "http://127.0.0.1:$port$case->{path}", sub { $cv_res->send(@_) };
my ($data, $headers) = $cv_res->recv;
is $headers->{Status}, $case->{exp_status}, "$case->{path}: response status OK";
like $data, $case->{exp_body}, "$case->{path}: response body OK";
}
}
( run in 0.240 second using v1.01-cache-2.11-cpan-4d50c553e7e )