Skip to content

Commit de70aa8

Browse files
committed
Copy changes to servicebus
1 parent efd350c commit de70aa8

3 files changed

Lines changed: 113 additions & 11 deletions

File tree

sdk/eventhub/azure-eventhub/azure/eventhub/_pyamqp/_decode.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,7 @@ def _decode_described(buffer: memoryview) -> Tuple[memoryview, object]:
313313
return buffer, value
314314

315315

316-
def _decode_described_array(buffer: memoryview, tp, descriptor) -> Tuple[memoryview, object]:
316+
def _decode_described_array(buffer: memoryview, tp: int, descriptor) -> Tuple[memoryview, Any]:
317317
buffer, value = _DECODE_BY_CONSTRUCTOR[tp](buffer)
318318
try:
319319
value = _DESCR_BY_CONSTRUCTOR[tp](value, descriptor=descriptor)
@@ -433,7 +433,7 @@ def decode_empty_frame(header: memoryview) -> Tuple[int, bytes]:
433433
_DECODE_BY_CONSTRUCTOR[224] = _decode_array_small
434434
_DECODE_BY_CONSTRUCTOR[240] = _decode_array_large
435435

436-
_DESCR_BY_CONSTRUCTOR = {
436+
_DESCR_BY_CONSTRUCTOR: Dict[int, Any] = {
437437
67: described.DescribedInt,
438438
68: described.DescribedInt,
439439
69: described.DescribedList,

sdk/servicebus/azure-servicebus/azure/servicebus/_pyamqp/_decode.py

Lines changed: 80 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from typing_extensions import Literal
2323

2424

25+
from . import described
2526
from .message import Message, Header, Properties
2627

2728
if TYPE_CHECKING:
@@ -153,6 +154,7 @@ def _decode_binary_large(buffer: memoryview) -> Tuple[memoryview, bytes]:
153154
length_index = c_unsigned_long.unpack(buffer[:4])[0] + 4
154155
return buffer[length_index:], buffer[4:length_index].tobytes()
155156

157+
156158
def _decode_decimal128(buffer: memoryview) -> Tuple[memoryview, decimal.Decimal]:
157159
"""
158160
Decode a Decimal128 value from the buffer.
@@ -254,23 +256,41 @@ def _decode_map_large(buffer: memoryview) -> Tuple[memoryview, Dict[Any, Any]]:
254256
def _decode_array_small(buffer: memoryview) -> Tuple[memoryview, List[Any]]:
255257
count = buffer[1] # Ignore first byte (size) and just rely on count
256258
if count:
257-
subconstructor = buffer[2]
258-
buffer = buffer[3:]
259259
values = [None] * count
260-
for i in range(count):
261-
buffer, values[i] = _DECODE_BY_CONSTRUCTOR[subconstructor](buffer)
260+
subconstructor = buffer[2]
261+
262+
if subconstructor == 0:
263+
composite_type = buffer[3]
264+
buffer, descriptor = _DECODE_BY_CONSTRUCTOR[composite_type](buffer[4:])
265+
subconstructor = buffer[0]
266+
buffer = buffer[1:]
267+
for i in range(count):
268+
buffer, values[i] = _decode_described_array(buffer, subconstructor, descriptor)
269+
else:
270+
buffer = buffer[3:]
271+
for i in range(count):
272+
buffer, values[i] = _DECODE_BY_CONSTRUCTOR[subconstructor](buffer)
262273
return buffer, values
263274
return buffer[2:], []
264275

265276

266277
def _decode_array_large(buffer: memoryview) -> Tuple[memoryview, List[Any]]:
267278
count = c_unsigned_long.unpack(buffer[4:8])[0]
268279
if count:
269-
subconstructor = buffer[8]
270-
buffer = buffer[9:]
271280
values = [None] * count
272-
for i in range(count):
273-
buffer, values[i] = _DECODE_BY_CONSTRUCTOR[subconstructor](buffer)
281+
subconstructor = buffer[8]
282+
283+
if subconstructor == 0:
284+
composite_type = buffer[9]
285+
buffer, descriptor = _DECODE_BY_CONSTRUCTOR[composite_type](buffer[10:])
286+
subconstructor = buffer[0]
287+
buffer = buffer[1:]
288+
for i in range(count):
289+
buffer, values[i] = _decode_described_array(buffer, subconstructor, descriptor)
290+
else:
291+
buffer = buffer[9:]
292+
for i in range(count):
293+
buffer, values[i] = _DECODE_BY_CONSTRUCTOR[subconstructor](buffer)
274294
return buffer, values
275295
return buffer[8:], []
276296

@@ -280,7 +300,25 @@ def _decode_described(buffer: memoryview) -> Tuple[memoryview, object]:
280300
# descriptor without decoding descriptor value
281301
composite_type = buffer[0]
282302
buffer, descriptor = _DECODE_BY_CONSTRUCTOR[composite_type](buffer[1:])
283-
buffer, value = _DECODE_BY_CONSTRUCTOR[buffer[0]](buffer[1:])
303+
tp = buffer[0]
304+
buffer, value = _DECODE_BY_CONSTRUCTOR[tp](buffer[1:])
305+
try:
306+
value = _DESCR_BY_CONSTRUCTOR[tp](value, descriptor=descriptor)
307+
except KeyError:
308+
pass
309+
try:
310+
composite_type = cast(int, _COMPOSITES[descriptor])
311+
return buffer, {composite_type: value}
312+
except KeyError:
313+
return buffer, value
314+
315+
316+
def _decode_described_array(buffer: memoryview, tp, descriptor) -> Tuple[memoryview, object]:
317+
buffer, value = _DECODE_BY_CONSTRUCTOR[tp](buffer)
318+
try:
319+
value = _DESCR_BY_CONSTRUCTOR[tp](value, descriptor=descriptor)
320+
except KeyError:
321+
pass
284322
try:
285323
composite_type = cast(int, _COMPOSITES[descriptor])
286324
return buffer, {composite_type: value}
@@ -394,3 +432,36 @@ def decode_empty_frame(header: memoryview) -> Tuple[int, bytes]:
394432
_DECODE_BY_CONSTRUCTOR[209] = _decode_map_large
395433
_DECODE_BY_CONSTRUCTOR[224] = _decode_array_small
396434
_DECODE_BY_CONSTRUCTOR[240] = _decode_array_large
435+
436+
_DESCR_BY_CONSTRUCTOR = {
437+
67: described.DescribedInt,
438+
68: described.DescribedInt,
439+
69: described.DescribedList,
440+
80: described.DescribedInt,
441+
81: described.DescribedInt,
442+
82: described.DescribedInt,
443+
83: described.DescribedInt,
444+
84: described.DescribedInt,
445+
85: described.DescribedInt,
446+
96: described.DescribedInt,
447+
97: described.DescribedInt,
448+
112: described.DescribedInt,
449+
113: described.DescribedInt,
450+
114: described.DescribedFloat,
451+
128: described.DescribedInt,
452+
129: described.DescribedInt,
453+
130: described.DescribedFloat,
454+
131: described.DescribedInt,
455+
160: described.DescribedBytes,
456+
161: described.DescribedBytes,
457+
163: described.DescribedBytes,
458+
176: described.DescribedBytes,
459+
177: described.DescribedBytes,
460+
179: described.DescribedBytes,
461+
192: described.DescribedList,
462+
193: described.DescribedDict,
463+
208: described.DescribedList,
464+
209: described.DescribedDict,
465+
224: described.DescribedList,
466+
240: described.DescribedList,
467+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# -------------------------------------------------------------------------
2+
# Copyright (c) Microsoft Corporation. All rights reserved.
3+
# Licensed under the MIT License. See License.txt in the project root for
4+
# license information.
5+
# --------------------------------------------------------------------------
6+
7+
class Described:
8+
def __new__(cls, value, descriptor=None):
9+
obj = super().__new__(cls, value)
10+
obj.descriptor = descriptor
11+
return obj
12+
13+
14+
class DescribedInt(Described, int):
15+
pass
16+
17+
18+
class DescribedFloat(Described, float):
19+
pass
20+
21+
22+
class DescribedBytes(Described, bytes):
23+
pass
24+
25+
26+
class DescribedList(Described, list):
27+
pass
28+
29+
30+
class DescribedDict(Described, dict):
31+
pass

0 commit comments

Comments
 (0)