summaryrefslogtreecommitdiff
path: root/qpid/python
diff options
context:
space:
mode:
authorGordon Sim <gsim@apache.org>2014-04-15 19:44:45 +0000
committerGordon Sim <gsim@apache.org>2014-04-15 19:44:45 +0000
commitffccd0abd6f8ffe3a6aec71f38015ffa460d1e19 (patch)
tree2ec4c37968a5a2e83cb08b7621f7bf25af3a0fa2 /qpid/python
parent2be29d43a76a7c8393bdd648f465eae8953e9d76 (diff)
downloadqpid-python-ffccd0abd6f8ffe3a6aec71f38015ffa460d1e19.tar.gz
QPID-5700: ensure interleaved segments on different tracks do not get confused
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1587710 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/python')
-rw-r--r--qpid/python/qpid/framing.py28
1 files changed, 16 insertions, 12 deletions
diff --git a/qpid/python/qpid/framing.py b/qpid/python/qpid/framing.py
index 62fd38dfcd..389b607853 100644
--- a/qpid/python/qpid/framing.py
+++ b/qpid/python/qpid/framing.py
@@ -252,31 +252,35 @@ class OpEncoder:
class OpDecoder:
def __init__(self):
- self.op = None
+ self.current_op = {}
self.ops = []
def write(self, *segments):
for seg in segments:
+ op = self.current_op.get(seg.track)
if seg.first:
if seg.type == segment_type.command:
- self.op = self.decode_command(seg.payload)
+ op = self.decode_command(seg.payload)
elif seg.type == segment_type.control:
- self.op = self.decode_control(seg.payload)
+ op = self.decode_control(seg.payload)
else:
raise ValueError(seg)
- self.op.channel = seg.channel
+ op.channel = seg.channel
elif seg.type == segment_type.header:
- if self.op.headers is None:
- self.op.headers = []
- self.op.headers.extend(self.decode_headers(seg.payload))
+ if op.headers is None:
+ op.headers = []
+ op.headers.extend(self.decode_headers(seg.payload))
elif seg.type == segment_type.body:
- if self.op.payload is None:
- self.op.payload = seg.payload
+ if op.payload is None:
+ op.payload = seg.payload
else:
- self.op.payload += seg.payload
+ op.payload += seg.payload
if seg.last:
- self.ops.append(self.op)
- self.op = None
+ self.ops.append(op)
+ if seg.track in self.current_op:
+ del self.current_op[seg.track]
+ else:
+ self.current_op[seg.track] = op
def decode_command(self, encoded):
sc = StringCodec(encoded)