def test_read_control_blocks(self): data = ('\x00\x01\00' '\x61\x02\x01\x00%s' '\x0a\x03\x01\x00\x00%s' '\x63\x04\x01\x00\x00\x00%s') % ('a' * 0x0100, 'b' * 0x010000, 'c' * 0x01000000) parser = mux._MuxFramePayloadParser(data) blocks = list(parser.read_control_blocks()) self.assertEqual(4, len(blocks)) self.assertEqual(mux._MUX_OPCODE_ADD_CHANNEL_REQUEST, blocks[0].opcode) self.assertEqual(0, blocks[0].encoding) self.assertEqual(0, len(blocks[0].encoded_handshake)) self.assertEqual(mux._MUX_OPCODE_DROP_CHANNEL, blocks[1].opcode) self.assertEqual(0, blocks[1].mux_error) self.assertEqual(0x0100, len(blocks[1].reason)) self.assertEqual(mux._MUX_OPCODE_ADD_CHANNEL_REQUEST, blocks[2].opcode) self.assertEqual(2, blocks[2].encoding) self.assertEqual(0x010000, len(blocks[2].encoded_handshake)) self.assertEqual(mux._MUX_OPCODE_DROP_CHANNEL, blocks[3].opcode) self.assertEqual(0, blocks[3].mux_error) self.assertEqual(0x01000000, len(blocks[3].reason)) self.assertEqual(len(data), parser._read_position)
def test_read_control_blocks(self): data = ('\x00\x01\00' '\x61\x02\x01\x00%s' '\x0a\x03\x01\x00\x00%s' '\x63\x04\x01\x00\x00\x00%s') % ( 'a' * 0x0100, 'b' * 0x010000, 'c' * 0x01000000) parser = mux._MuxFramePayloadParser(data) blocks = list(parser.read_control_blocks()) self.assertEqual(4, len(blocks)) self.assertEqual(mux._MUX_OPCODE_ADD_CHANNEL_REQUEST, blocks[0].opcode) self.assertEqual(0, blocks[0].encoding) self.assertEqual(0, len(blocks[0].encoded_handshake)) self.assertEqual(mux._MUX_OPCODE_DROP_CHANNEL, blocks[1].opcode) self.assertEqual(0, blocks[1].mux_error) self.assertEqual(0x0100, len(blocks[1].reason)) self.assertEqual(mux._MUX_OPCODE_ADD_CHANNEL_REQUEST, blocks[2].opcode) self.assertEqual(2, blocks[2].encoding) self.assertEqual(0x010000, len(blocks[2].encoded_handshake)) self.assertEqual(mux._MUX_OPCODE_DROP_CHANNEL, blocks[3].opcode) self.assertEqual(0, blocks[3].mux_error) self.assertEqual(0x01000000, len(blocks[3].reason)) self.assertEqual(len(data), parser._read_position)
def test_channel_id_decode(self): data = '\x00\x01\xbf\xff\xdf\xff\xff\xff\xff\xff\xff' parser = mux._MuxFramePayloadParser(data) channel_id = parser.read_channel_id() self.assertEqual(0, channel_id) channel_id = parser.read_channel_id() self.assertEqual(1, channel_id) channel_id = parser.read_channel_id() self.assertEqual(2**14 - 1, channel_id) channel_id = parser.read_channel_id() self.assertEqual(2**21 - 1, channel_id) channel_id = parser.read_channel_id() self.assertEqual(2**29 - 1, channel_id) self.assertEqual(len(data), parser._read_position)
def test_channel_id_decode(self): data = '\x00\x01\xbf\xff\xdf\xff\xff\xff\xff\xff\xff' parser = mux._MuxFramePayloadParser(data) channel_id = parser.read_channel_id() self.assertEqual(0, channel_id) channel_id = parser.read_channel_id() self.assertEqual(1, channel_id) channel_id = parser.read_channel_id() self.assertEqual(2 ** 14 - 1, channel_id) channel_id = parser.read_channel_id() self.assertEqual(2 ** 21 - 1, channel_id) channel_id = parser.read_channel_id() self.assertEqual(2 ** 29 - 1, channel_id) self.assertEqual(len(data), parser._read_position)
def write(self, data): """Override MockBlockingConn.write.""" self._current_data = data self._position = 0 def _receive_bytes(length): if self._position + length > len(self._current_data): raise ConnectionTerminatedException( 'Failed to receive %d bytes from encapsulated ' 'frame' % length) data = self._current_data[self._position:self._position + length] self._position += length return data opcode, payload, fin, rsv1, rsv2, rsv3 = (parse_frame( _receive_bytes, unmask_receive=False)) self._pending_fragments.append(payload) if self._current_opcode is None: if opcode == common.OPCODE_CONTINUATION: raise Exception('Sending invalid continuation opcode') self._current_opcode = opcode else: if opcode != common.OPCODE_CONTINUATION: raise Exception('Sending invalid opcode %d' % opcode) if not fin: return inner_frame_data = ''.join(self._pending_fragments) self._pending_fragments = [] self._current_opcode = None parser = mux._MuxFramePayloadParser(inner_frame_data) channel_id = parser.read_channel_id() if channel_id == mux._CONTROL_CHANNEL_ID: self._control_blocks.append(parser.remaining_data()) return if not channel_id in self._channel_data: self._channel_data[channel_id] = _OutgoingChannelData() channel_data = self._channel_data[channel_id] (inner_fin, inner_rsv1, inner_rsv2, inner_rsv3, inner_opcode, inner_payload) = parser.read_inner_frame() channel_data.pending_fragments.append(inner_payload) if channel_data.current_opcode is None: if inner_opcode == common.OPCODE_CONTINUATION: raise Exception('Sending invalid continuation opcode') channel_data.current_opcode = inner_opcode else: if inner_opcode != common.OPCODE_CONTINUATION: raise Exception('Sending invalid opcode %d' % inner_opcode) if not inner_fin: return message = ''.join(channel_data.pending_fragments) channel_data.pending_fragments = [] if (channel_data.current_opcode == common.OPCODE_TEXT or channel_data.current_opcode == common.OPCODE_BINARY): channel_data.messages.append(message) else: channel_data.control_messages.append({ 'opcode': channel_data.current_opcode, 'message': message }) channel_data.current_opcode = None
def write(self, data): """Override MockBlockingConn.write.""" self._current_data = data self._position = 0 def _receive_bytes(length): if self._position + length > len(self._current_data): raise ConnectionTerminatedException( 'Failed to receive %d bytes from encapsulated ' 'frame' % length) data = self._current_data[self._position:self._position+length] self._position += length return data opcode, payload, fin, rsv1, rsv2, rsv3 = ( parse_frame(_receive_bytes, unmask_receive=False)) self._pending_fragments.append(payload) if self._current_opcode is None: if opcode == common.OPCODE_CONTINUATION: raise Exception('Sending invalid continuation opcode') self._current_opcode = opcode else: if opcode != common.OPCODE_CONTINUATION: raise Exception('Sending invalid opcode %d' % opcode) if not fin: return inner_frame_data = ''.join(self._pending_fragments) self._pending_fragments = [] self._current_opcode = None parser = mux._MuxFramePayloadParser(inner_frame_data) channel_id = parser.read_channel_id() if channel_id == mux._CONTROL_CHANNEL_ID: self._control_blocks.append(parser.remaining_data()) return if not channel_id in self._channel_data: self._channel_data[channel_id] = _OutgoingChannelData() channel_data = self._channel_data[channel_id] (inner_fin, inner_rsv1, inner_rsv2, inner_rsv3, inner_opcode, inner_payload) = parser.read_inner_frame() channel_data.pending_fragments.append(inner_payload) if channel_data.current_opcode is None: if inner_opcode == common.OPCODE_CONTINUATION: raise Exception('Sending invalid continuation opcode') channel_data.current_opcode = inner_opcode else: if inner_opcode != common.OPCODE_CONTINUATION: raise Exception('Sending invalid opcode %d' % inner_opcode) if not inner_fin: return message = ''.join(channel_data.pending_fragments) channel_data.pending_fragments = [] if (channel_data.current_opcode == common.OPCODE_TEXT or channel_data.current_opcode == common.OPCODE_BINARY): channel_data.messages.append(message) else: channel_data.control_messages.append( {'opcode': channel_data.current_opcode, 'message': message}) channel_data.current_opcode = None