Plack-Handler-Stomp
view release on metacpan or search on metacpan
lib/Plack/Handler/Stomp.pm view on Meta::CPAN
my $sub_id = $headers->{id};
$self->destination_path_map->{$destination} =
$self->destination_path_map->{"/subscription/$sub_id"} =
$sub->{path_info} || $destination;
return;
};
sub build_psgi_env {
my ($self, $frame) = @_;
my $destination = $frame->headers->{destination};
my $sub_id = $frame->headers->{subscription};
my $path_info;
if (defined $sub_id) {
$path_info = $self->destination_path_map->{"/subscription/$sub_id"}
};
$path_info ||= $self->destination_path_map->{$destination};
if ($path_info) {
$path_info = munge_path_info(
$path_info,
$self->current_server,
$frame,
);
}
$path_info ||= $destination; # should not really be needed
use bytes;
my $env = {
# server
SERVER_NAME => 'localhost',
SERVER_PORT => 0,
SERVER_PROTOCOL => 'STOMP',
# client
REQUEST_METHOD => 'POST',
REQUEST_URI => $path_info,
SCRIPT_NAME => '',
PATH_INFO => $path_info,
QUERY_STRING => '',
# broker
REMOTE_ADDR => $self->current_server->{hostname},
# http
HTTP_USER_AGENT => 'Net::Stomp',
CONTENT_LENGTH => length($frame->body),
CONTENT_TYPE => ( $frame->headers->{'content-type'} || 'application/octet-stream' ),
# psgi
'psgi.version' => [1,0],
'psgi.url_scheme' => 'http',
'psgi.multithread' => 0,
'psgi.multiprocess' => 0,
'psgi.run_once' => 0,
'psgi.nonblocking' => 0,
'psgi.streaming' => 1,
'psgi.input' => do {
open my $input, '<', \($frame->body);
$input;
},
'psgi.errors' => Plack::Util::inline_object(
print => sub { $self->logger->error(@_) },
),
};
if ($frame->headers) {
for my $header (keys %{$frame->headers}) {
$env->{"jms.$header"} = $frame->headers->{$header};
}
}
return $env;
}
__PACKAGE__->meta->make_immutable;
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
Plack::Handler::Stomp - adapt STOMP to (almost) HTTP, via Plack
=head1 VERSION
version 1.15
=head1 SYNOPSIS
my $runner = Plack::Handler::Stomp->new({
servers => [ { hostname => 'localhost', port => 61613 } ],
subscriptions => [
{ destination => '/queue/plack-handler-stomp-test' },
{ destination => '/topic/plack-handler-stomp-test',
headers => {
selector => q{custom_header = '1' or JMSType = 'test_foo'},
},
path_info => '/topic/ch1', },
{ destination => '/topic/plack-handler-stomp-test',
headers => {
selector => q{custom_header = '2' or JMSType = 'test_bar'},
},
path_info => '/topic/ch2', },
],
});
$runner->run(MyApp->get_app());
=head1 DESCRIPTION
Sometimes you want to use your very nice web-application-framework
lib/Plack/Handler/Stomp.pm view on Meta::CPAN
=head2 C<maybe_send_reply>
Calls L</where_should_send_reply> to determine if to send a reply, and
where. If it returns a true value, L</send_reply> is called to
actually send the reply.
=head2 C<where_should_send_reply>
Returns the header C<X-Reply-Address> or C<X-STOMP-Reply-Address> from
the response.
=head2 C<send_reply>
Converts the PSGI response into a STOMP frame, by removing the prefix
C<x-stomp-> from the key of header fields that have it, removing
entirely header fields that don't, and stringifying the body.
Then sends the frame.
=head2 C<subscribe_single>
C<after> modifier on the method provided by
L<Net::Stomp::MooseHelpers::CanSubscribe>.
It sets the L</destination_path_map> to map the destination and the
subscription id to the C<path_info> slot of the L</subscriptions>
element, or to the destination itself if C<path_info> is not defined.
=head2 C<build_psgi_env>
Builds a PSGI environment from the message, like:
# server
SERVER_NAME => 'localhost',
SERVER_PORT => 0,
SERVER_PROTOCOL => 'STOMP',
# client
REQUEST_METHOD => 'POST',
REQUEST_URI => $path_info,
SCRIPT_NAME => '',
PATH_INFO => $path_info,
QUERY_STRING => '',
# broker
REMOTE_ADDR => $server_hostname,
# http
HTTP_USER_AGENT => 'Net::Stomp',
CONTENT_LENGTH => length($body),
CONTENT_TYPE => $content-type,
# psgi
'psgi.version' => [1,0],
'psgi.url_scheme' => 'http',
'psgi.multithread' => 0,
'psgi.multiprocess' => 0,
'psgi.run_once' => 0,
'psgi.nonblocking' => 0,
'psgi.streaming' => 1,
In addition, reading from C<psgi.input> will return the message body,
and writing to C<psgi.errors> will log via the L</logger> at level
C<error>.
Finally, every header in the STOMP message will be available in the
"namespace" C<jms.>, so for example the message type is in
C<jms.type>.
The C<$path_info> is obtained from the L</destination_path_map>
(i.e. from the C<path_info> subscription options) passed through
L<munge_path_info|Plack::Handler::Stomp::PathInfoMunger/munge_path_info>.
=head1 EXAMPLES
You can find examples of use in the tests, or at
https://github.com/dakkar/CatalystX-StompSampleApps
=head1 AUTHOR
Gianni Ceccarelli <gianni.ceccarelli@net-a-porter.com>
=head1 COPYRIGHT AND LICENSE
This software is copyright (c) 2020 by Net-a-porter.com.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
=cut
( run in 0.779 second using v1.01-cache-2.11-cpan-6aa56a78535 )