[ 
https://issues.apache.org/jira/browse/PROTON-2531?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17921735#comment-17921735
 ] 

Pete Fawcett commented on PROTON-2531:
--------------------------------------

I have encountered a problem as a result of the issue described in this ticket.

I have a Python client which processes messages received from a Qpid broker 
(The C++ one) As part of the processing I read the tag from the incoming 
delivery so that I can do asynchronous acknowledgement of messages when the 
local processing has completed.

When I tried to use this client with version 0.40.0, I started getting 
exceptions thrown when reading the tag from some deliveries. 
({{{}UnicodeDecodeError{}}})

The problem is that {{pn_delivery_tag}} is converting the received bytes into a 
{{str}} using "utf-8" decoding. The tag in the delivery from the Qpid broker is 
arbitrary bytes and so may not be valid UTF-8. (Actually, the tag looks to be a 
big-endian representation of a 32-bit integer sequence number, so the exception 
gets thrown when the 128th message is received.)

The current unit tests do not show up the problem because, from what I can see, 
the tag values used are all ANSI characters (i.e. < 128), even when testing 
with bytes. Also, since the Python bindings are being used at 'both ends' of 
the test the bytes in the tag are always valid UTF-8 when set via a string.

I am working on a PR to fix this issue.

>From one point of view I would prefer to change the return type of {{tag}} to 
>be {{bytes}} but I don't think this is feasible. So I am suggesting two 
>possible fixes.

[~astitcher], you make the point that the type annotations are not necessarily 
binding, but the problem I see is that the current {{tag}} property does 
actually return a string. If it was changed to {{bytes}} then it would break 
existing client code.

My first fix is to use {{raw_unicode_escape}} when encoding/decoding between 
{{str}} and {{{}bytes{}}}. This seems to work for all byte values (0x00 - 0xFF).

The second fix is to follow the suggestion earlier in this ticket and implement 
a {{btag}} property and matching {{pn_delivery_btag()}} function to return the 
actual bytes received - and avoid all that tedious mucking about in codecs.

Any thoughts on which fix might be preferable? (Both could be included)

Code is currently in 
[pjfawcett/qpid-proton|https://github.com/apache/qpid-proton/compare/main...pjfawcett:qpid-proton:PROTON-2531]
 but I haven't submitted a PR yet, partly because I am adding some more tests.

Also, can this ticket be assigned to me?

Thanks

> Delivery tag is str while it should be bytes
> --------------------------------------------
>
>                 Key: PROTON-2531
>                 URL: https://issues.apache.org/jira/browse/PROTON-2531
>             Project: Qpid Proton
>          Issue Type: Bug
>          Components: python-binding
>            Reporter: Ievgen Popovych
>            Priority: Major
>
> According to AMQP standard delivery tag is ??up to 32 octets of binary 
> data??. Proton C library also has it in binary format.
> But in the Python binding {{Delivery.tag}} is a string, which causes issues 
> when trying to use it (i.e. print/visualize).
> As far as I understand this is down to Swig {{python/cproton.i}} 
> {{wrap_pn_delivery_tag}} (since typemap for {{pn_delivery_tag_t}} seems to be 
> correct)?



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@qpid.apache.org
For additional commands, e-mail: dev-h...@qpid.apache.org

Reply via email to