package Net::Stomp::Frame; use strict; use warnings; use base 'Class::Accessor::Fast'; __PACKAGE__->mk_accessors(qw(command headers body)); sub as_string { my $self = shift; my $command = $self->command; my $headers = $self->headers; my $body = $self->body; my $frame = $command . "\n"; # insert a content-length header my $bytes_message = 0; if ( $headers->{bytes_message} ) { $bytes_message = 1; delete $headers->{bytes_message}; $headers->{"content-length"} = length( $self->body ); } while ( my ( $key, $value ) = each %{ $headers || {} } ) { $frame .= $key . ':' . $value . "\n"; } $frame .= "\n"; $frame .= $body || ''; $frame .= "\000"; } sub parse { my ( $package, $socket ) = @_; local $/ = "\n"; # read the command my $command; while (1) { $command = $socket->getline || die "Error reading command: $!"; chop $command; last if $command; } # read headers my $headers; while (1) { my $line = $socket->getline || die "Error reading header: $!"; chop $line; last if $line eq ""; my ( $key, $value ) = split /: ?/, $line, 2; $headers->{$key} = $value; } # read the body my $body; if ( $headers->{"content-length"} ) { $socket->read( $body, $headers->{"content-length"} ) || die "Error reading body: $!"; $socket->getc; # eat the trailing null $headers->{bytes_message} = 1; } else { while (1) { my $byte = $socket->getc; die "Error reading body: $!" unless defined $byte; last if $byte eq "\000"; $body .= $byte; } } my $frame = Net::Stomp::Frame->new( { command => $command, headers => $headers, body => $body } ); return $frame; } 1; __END__ =head1 NAME Net::Stomp::Frame - A STOMP Frame =head1 SYNOPSIS use Net::Stomp::Frame; my $frame = Net::Stomp::Frame->new( { command => $command, headers => $headers, body => $body, } ); my $frame = Net::Stomp::Frame->parse($string); my $string = $frame->as_string; =head1 DESCRIPTION This module encapulates a Stomp frame. Stomp is the Streaming Text Orientated Messaging Protocol (or the Protocol Briefly Known as TTMP and Represented by the symbol :ttmp). It's a simple and easy to implement protocol for working with Message Orientated Middleware from any language. L is useful for talking to Apache ActiveMQ, an open source (Apache 2.0 licensed) Java Message Service 1.1 (JMS) message broker packed with many enterprise features. A Stomp frame consists of a command, a series of headers and a body. For details on the protocol see L. =head1 METHODS =head2 new Create a new L object: my $frame = Net::Stomp::Frame->new( { command => $command, headers => $headers, body => $body, } ); =head2 parse Create a new L given a string containing the serialised frame: my $frame = Net::Stomp::Frame->parse($string); =head2 as_string Create a string containing the serialised frame representing the frame: my $string = $frame->as_string; =head1 SEE ALSO L. =head1 AUTHOR Leon Brocard . =head1 COPYRIGHT Copyright (C) 2006, Leon Brocard This module is free software; you can redistribute it or modify it under the same terms as Perl itself.