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)
Beispiel #2
0
    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)
Beispiel #4
0
 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
Beispiel #6
0
    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