You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@qpid.apache.org by "ASF subversion and git services (Jira)" <ji...@apache.org> on 2020/08/12 16:16:00 UTC

[jira] [Commented] (PROTON-2244) [Proton-c] Encoder error for array of lists where first list in array is empty

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

ASF subversion and git services commented on PROTON-2244:
---------------------------------------------------------

Commit 5975c2000a0a222d944d955a0e0e111eab501bcc in qpid-proton's branch refs/heads/array-of-lists-first-list-empty from Kim van der Riet
[ https://gitbox.apache.org/repos/asf?p=qpid-proton.git;h=5975c20 ]

PROTON-2244: Removed array tests of all but array of lists, as this is the issue. The consensus is that we need to make the tests compare encoded bytes with expected encoded bytes, not perform an encode/decode comparison as these tests do at present. This should be done at a later time.


> [Proton-c] Encoder error for array of lists where first list in array is empty
> ------------------------------------------------------------------------------
>
>                 Key: PROTON-2244
>                 URL: https://issues.apache.org/jira/browse/PROTON-2244
>             Project: Qpid Proton
>          Issue Type: Task
>          Components: proton-c
>            Reporter: Kim van der Riet
>            Priority: Major
>
> AMQP encodes arrays with a single element constructor which should be identical for all elements in the array. However, if an array of lists is constructed in which the first list is empty, then the AMQP empty list constructor is used in the array, and the following lists which may be non-empty, will not be decoded correctly.
> {noformat}
> >>> import proton
> >>> a = proton.Array(proton.UNDESCRIBED, proton.Data.LIST, [], [1,2,3], ['aaa', 'bbb', 'ccc'])
> >>> d1 = proton.Data()
> >>> d1.put_py_array(a)
> >>> d1.encode().hex()
> 'f00000002a00000003450000000a000000035501550255030000001300000003a103616161a103626262a103636363'
> {noformat}
> which, when broken down into parts, looks as follows:
> {noformat}
> f0 000002a 00000003 45 <-- Array constructor, size=0x2a, len=3, type=empty list
>                     ^^--- Empty list constructor
> 0000000a 00000003 5501 5502 5503 <- data for [1,2,3]
> 00000013 00000003 a103616161 a103626262 a103636363 <-- data for ['aaa', 'bbb', 'ccc']
> {noformat}
> When decoded, this is being interpreted as an array of empty lists:
> {noformat}
> >>> d2 = proton.Data()
> >>> d2.decode(d1.encode())
> 10
> >>> d2.get_py_array()
> Array(UNDESCRIBED, 24, [], [], [])
> {noformat}
> When a mis-encoded array is used in the body of a message and is decoded, an error results:
> {noformat}
> >>> import proton
> >>> a = proton.Array(proton.UNDESCRIBED, proton.Data.LIST, [], [1,2,3], ['aaa', 'bbb', 'ccc'])
> >>> m1 = proton.Message(body=a)
> >>> m1
> Message(priority=4, body=Array(UNDESCRIBED, 24, [], [1, 2, 3], ['aaa', 'bbb', 'ccc']))
> >>> m2 = proton.Message()
> >>> m2.decode(m1.encode())
> Traceback (most recent call last):
>  File "<stdin>", line 1, in <module>
>  File "/home/kvdr/RedHat/install/lib64/proton/bindings/python3/proton/_message.py", line 488, in decode
>  self._check(pn_message_decode(self._msg, data))
>  File "/home/kvdr/RedHat/install/lib64/proton/bindings/python3/proton/_message.py", line 87, in _check
>  raise exc("[%s]: %s" % (err, pn_error_text(pn_message_error(self._msg))))
> proton._exceptions.MessageException: [-6]: data error: (null)
> {noformat}



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

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