Hi Ernie,
Messenger per se certainly supports this, the python binding introspects
the types accurately and I'm currently writing unit tests for my
JavaScript port to prove test the JavaScript introspection behaves
correctly too, so if you are seeing an issue it'll be with the Perl
binding and not with the underlying Messenger.
Unfortunately I don't know Perl especially well so I can't help much
other than to suggest that you take a look in the files
<proton>/proton-c/bindings/perl/lib/qpid/proton/Message.pm
<proton>/proton-c/bindings/perl/lib/qpid/proton/Data.pm
The most likely place you want to look is the method preencode() in
Message.pm, when you call $messenger->put() it'll call
$message->preencode();
Inside preencode() it's calling
$body_type->put($body, $my_body) if($my_body && $body_type);
which (I think form the following code in Constants.pm
MAP => qpid::proton::Mapping->new(
"map",
$cproton_perl::PN_MAP,
"put_map_helper",
"get_map_helper"),
)
results in put_map_helper in Data.pm getting called
- aha!! having just "shown my working" I see the following:
sub put_map_helper {
my ($self) = @_;
my ($hash) = $_[1];
$self->put_map;
$self->enter;
foreach(keys $hash) {
$self->put_string("$_");
$self->put_string("$hash->{$_}");
}
$self->exit;
}
I guess that the
$self->put_string("$_");
$self->put_string("$hash->{$_}");
are the culprits, so it looks like the Perl binding is indeed putting
string values for the AMQP Map values.
So I'm afraid my long answer to you short question appears to be that
Messenger per se does not have the limitation you observe, but it looks
like the Perl binding does (if my interpretation of the code is correct) :-(
Frase
On 15/05/14 18:04, Ernest Allen wrote:
Does proton messenger support sending complex maps as the message body? That
is, maps whose values are other maps or lists and not just strings?
When I send a message and the body is encoded as qpid::proton::MAP, the map
values appear to have been converted to strings.
For example (in perl)
In the sender
$msg->set_body({"foo" => 2, "bar" => [3]}, qpid::proton::MAP);
In the receiver when I dump the body, I'm getting
$VAR1 = \{
'bar' => 'ARRAY(0xa2aad0)',
'foo' => '2'
};
It appears that the array has been converted to the string 'ARRAY(0x...)'. And
the 2 is now a string '2'.
I don't think this is just the way the receiver is dumping the message body as
I'm not able to convert the results to the expected type or variable.
When I send a perl HASH instead of an array as one of the values, it is coming
through as the string'HASH(0x....)'.
-Ernie