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 )