Show More
@@ -0,0 +1,26 b'' | |||
|
1 | """Test serialize/deserialize messages with buffers""" | |
|
2 | ||
|
3 | import os | |
|
4 | ||
|
5 | import nose.tools as nt | |
|
6 | ||
|
7 | from IPython.kernel.zmq.session import Session | |
|
8 | from ..base.zmqhandlers import ( | |
|
9 | serialize_binary_message, | |
|
10 | deserialize_binary_message, | |
|
11 | ) | |
|
12 | ||
|
13 | def test_serialize_binary(): | |
|
14 | s = Session() | |
|
15 | msg = s.msg('data_pub', content={'a': 'b'}) | |
|
16 | msg['buffers'] = [ os.urandom(3) for i in range(3) ] | |
|
17 | bmsg = serialize_binary_message(msg) | |
|
18 | nt.assert_is_instance(bmsg, bytes) | |
|
19 | ||
|
20 | def test_deserialize_binary(): | |
|
21 | s = Session() | |
|
22 | msg = s.msg('data_pub', content={'a': 'b'}) | |
|
23 | msg['buffers'] = [ os.urandom(2) for i in range(3) ] | |
|
24 | bmsg = serialize_binary_message(msg) | |
|
25 | msg2 = deserialize_binary_message(bmsg) | |
|
26 | nt.assert_equal(msg2, msg) |
@@ -23,7 +23,7 b' from tornado import web' | |||
|
23 | 23 | from tornado import websocket |
|
24 | 24 | |
|
25 | 25 | from IPython.kernel.zmq.session import Session |
|
26 | from IPython.utils.jsonutil import date_default | |
|
26 | from IPython.utils.jsonutil import date_default, extract_dates | |
|
27 | 27 | from IPython.utils.py3compat import PY3, cast_unicode |
|
28 | 28 | |
|
29 | 29 | from .handlers import IPythonHandler |
@@ -45,7 +45,9 b' def serialize_binary_message(msg):' | |||
|
45 | 45 | The message serialized to bytes. |
|
46 | 46 | |
|
47 | 47 | """ |
|
48 | buffers = msg.pop('buffers') | |
|
48 | # don't modify msg or buffer list in-place | |
|
49 | msg = msg.copy() | |
|
50 | buffers = list(msg.pop('buffers')) | |
|
49 | 51 | bmsg = json.dumps(msg, default=date_default).encode('utf8') |
|
50 | 52 | buffers.insert(0, bmsg) |
|
51 | 53 | nbufs = len(buffers) |
@@ -72,13 +74,15 b' def deserialize_binary_message(bmsg):' | |||
|
72 | 74 | |
|
73 | 75 | message dictionary |
|
74 | 76 | """ |
|
75 | nbufs = struct.unpack('i', bmsg[:4])[0] | |
|
77 | nbufs = struct.unpack('!i', bmsg[:4])[0] | |
|
76 | 78 | offsets = list(struct.unpack('!' + 'i' * nbufs, bmsg[4:4*(nbufs+1)])) |
|
77 | 79 | offsets.append(None) |
|
78 | 80 | bufs = [] |
|
79 | 81 | for start, stop in zip(offsets[:-1], offsets[1:]): |
|
80 | 82 | bufs.append(bmsg[start:stop]) |
|
81 | msg = json.loads(bufs[0]) | |
|
83 | msg = json.loads(bufs[0].decode('utf8')) | |
|
84 | msg['header'] = extract_dates(msg['header']) | |
|
85 | msg['parent_header'] = extract_dates(msg['parent_header']) | |
|
82 | 86 | msg['buffers'] = bufs[1:] |
|
83 | 87 | return msg |
|
84 | 88 | |
@@ -139,14 +143,6 b' class ZMQStreamHandler(websocket.WebSocketHandler):' | |||
|
139 | 143 | """ |
|
140 | 144 | idents, msg_list = self.session.feed_identities(msg_list) |
|
141 | 145 | msg = self.session.deserialize(msg_list) |
|
142 | try: | |
|
143 | msg['header'].pop('date') | |
|
144 | except KeyError: | |
|
145 | pass | |
|
146 | try: | |
|
147 | msg['parent_header'].pop('date') | |
|
148 | except KeyError: | |
|
149 | pass | |
|
150 | 146 | if msg['buffers']: |
|
151 | 147 | buf = serialize_binary_message(msg) |
|
152 | 148 | return buf |
General Comments 0
You need to be logged in to leave comments.
Login now