[ https://issues.apache.org/jira/browse/PROTON-736?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14196358#comment-14196358 ]
Dominic Evans commented on PROTON-736: -------------------------------------- [~mcpierce] as discussed on IRC The problem here is that ruby doesn't really differentiate between Binary data and (utf-8) String data. The IO.binread [1] method just reads that data into a string primitive and marks it as rb:ASCII-8BIT to prevent any encoding/decoding or line-ending changes from taking place on it. This can be seen in the mapping.rb code by the fact that the AMQP Binary type has klasses=nil for Ruby. As such, if you use the message.body= setter and give it a String, you will always end up with the message body being encoded as an AmqpValue containing a String type. However, this is actually a spec-incompliant behaviour, because the spec states that a String type will only contain UTF-8 encoded data. Hence, if you try to receive that message using either a proton-j or python client the String will fail to decode. Its not obvious what the correct fix here would be, but I'd suggest something along the lines of: 1) raise an exception in msg.body= if you pass a string primitive that doesn't contain valid UTF-8 2) add the ability in message.rb to set your own arbitary Qpid::Proton::Data object as the message body and map to and from that rather than ruby primitives if it has been used -- [1] http://ruby-doc.org/core-1.9.2/IO.html#method-c-binread > ruby: unable to send binary data? > --------------------------------- > > Key: PROTON-736 > URL: https://issues.apache.org/jira/browse/PROTON-736 > Project: Qpid Proton > Issue Type: Bug > Components: ruby-binding > Affects Versions: 0.8 > Reporter: Dominic Evans > Assignee: Darryl L. Pierce > Attachments: > 0001-PROTON-736-Ruby-Message-does-not-return-all-content.patch > > > As discussed on irc with [~mcpierce] > I've not been able to determine how I can correctly send binary data using > the ruby gem. > From proton-c I can do this by (e.g.,) > {{ > char* msgdata = Buffer::Data(buffer); > size_t msglen = Buffer::Length(buffer); > pn_message_set_format(msg->message, PN_DATA); > pn_message_load_data(msg->message, msgdata, msglen); > }} > and I assumed I might be able to do similar from Ruby by (e.g.,) > {{ > data = File.binread(filename) > msg.format = Qpid::Proton::MessageFormat::DATA > msg.content = data > }} > But Ruby is reading the data into a string and the SWIG binding is still > expecting a byte* array here. > After our discussions on IRC I also investigated doing: > {{ > filedata = File.binread(filename) > data = Qpid::Proton::Data.new > data.binary = filedata > msg.body = data > }} > but didn't have any luck with this approach either. -- This message was sent by Atlassian JIRA (v6.3.4#6332)