package Net::AMQP; =head1 NAME Net::AMQP - Advanced Message Queue Protocol (de)serialization and representation =head1 SYNOPSIS use Net::AMQP; Net::AMQP::Protocol->load_xml_spec('amqp0-8.xml'); ... my @frames = Net::AMQP->parse_raw_frames(\$input); ... foreach my $frame (@frames) { if ($frame->can('method_frame') && $frame->method_frame->isa('Net::AMQP::Protocol::Connection::Start')) { my $output = Net::AMQP::Frame::Method->new( channel => 0, method_frame => Net::AMQP::Protocol::Connection::StartOk->new( client_properties => { ... }, mechanism => 'AMQPLAIN', locale => 'en_US', response => { LOGIN => 'guest', PASSWORD => 'guest', }, ), ); print OUT $output->to_raw_frame(); } } =head1 DESCRIPTION This module implements the frame (de)serialization and representation of the Advanced Message Queue Protocol (http://www.amqp.org/). It is to be used in conjunction with client or server software that does the actual TCP/IP communication. =cut use strict; use warnings; use Net::AMQP::Protocol; use Net::AMQP::Frame; use Carp; our $VERSION = 0.05; use constant { _HEADER_LEN => 7, # 'CnN' _FOOTER_LEN => 1, # 'C' }; =head1 CLASS METHODS =head2 parse_raw_frames Net::AMQP->parse_raw_frames(\$binary_payload) Given a scalar reference to a binary string, return a list of L objects, consuming the data in the string. Croaks on invalid input. =cut sub parse_raw_frames { my ($class, $input_ref) = @_; my @frames; while (length($$input_ref) >= _HEADER_LEN + _FOOTER_LEN) { my ($type_id, $channel, $size) = unpack 'CnN', $$input_ref; last if length($$input_ref) < _HEADER_LEN + $size + _FOOTER_LEN; substr $$input_ref, 0, _HEADER_LEN, ''; my $payload = substr $$input_ref, 0, $size, ''; my $frame_end_octet = unpack 'C', substr $$input_ref, 0, _FOOTER_LEN, ''; if ($frame_end_octet != 206) { croak "Invalid frame-end octet ($frame_end_octet)"; } push @frames, Net::AMQP::Frame->factory( type_id => $type_id, channel => $channel, payload => $payload, ); } return @frames; } =head1 SEE ALSO L =head1 TODO At the moment, only AMQP v0-8 is supported. Support for v0-10 and later v1-0 is hoped for. =head1 COPYRIGHT Copyright (c) 2009 Eric Waters and XMission LLC (http://www.xmission.com/). All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. The full text of the license can be found in the LICENSE file included with this module. =head1 AUTHOR Eric Waters =cut 1;