예제 #1
0
 def test_find_value_response(self):
     found_value_response = {b'2' * 48: [b'\x7f\x00\x00\x01']}
     serialized = ResponseDatagram(RESPONSE_TYPE, b'1' * 20, b'1' * 48, found_value_response).bencode()
     decoded = decode_datagram(serialized)
     self.assertEqual(decoded.packet_type, RESPONSE_TYPE)
     self.assertEqual(decoded.rpc_id, b'1' * 20)
     self.assertEqual(decoded.node_id, b'1' * 48)
     self.assertDictEqual(decoded.response, found_value_response)
예제 #2
0
 def test_ping_response(self):
     serialized = ResponseDatagram(RESPONSE_TYPE, b'1' * 20, b'1' * 48,
                                   b'pong').bencode()
     decoded = decode_datagram(serialized)
     self.assertEqual(decoded.packet_type, RESPONSE_TYPE)
     self.assertEqual(decoded.rpc_id, b'1' * 20)
     self.assertEqual(decoded.node_id, b'1' * 48)
     self.assertEqual(decoded.response, b'pong')
예제 #3
0
    def test_find_node_response(self):
        closest_response = [(b'3' * 48, '1.2.3.4', 1234)]
        expected = [[b'3' * 48, b'1.2.3.4', 1234]]

        serialized = ResponseDatagram(RESPONSE_TYPE, b'1' * 20, b'1' * 48, closest_response).bencode()
        decoded = decode_datagram(serialized)
        self.assertEqual(decoded.packet_type, RESPONSE_TYPE)
        self.assertEqual(decoded.rpc_id, b'1' * 20)
        self.assertEqual(decoded.node_id, b'1' * 48)
        self.assertEqual(decoded.response, expected)
예제 #4
0
파일: protocol.py 프로젝트: niping1978/lbry
    async def _handle_rpc(self, sender_contact: 'KademliaPeer',
                          message: RequestDatagram):
        assert sender_contact.node_id != self.node_id, (binascii.hexlify(
            sender_contact.node_id)[:8].decode(), binascii.hexlify(
                self.node_id)[:8].decode())
        method = message.method
        if method not in [b'ping', b'store', b'findNode', b'findValue']:
            raise AttributeError('Invalid method: %s' %
                                 message.method.decode())
        if message.args and isinstance(
                message.args[-1],
                dict) and b'protocolVersion' in message.args[-1]:
            # args don't need reformatting
            a, kw = tuple(message.args[:-1]), message.args[-1]
        else:
            a, kw = self._migrate_incoming_rpc_args(sender_contact,
                                                    message.method,
                                                    *message.args)
        log.debug("%s:%i RECV CALL %s %s:%i", self.external_ip, self.udp_port,
                  message.method.decode(), sender_contact.address,
                  sender_contact.udp_port)

        if method == b'ping':
            result = self.node_rpc.ping()
        elif method == b'store':
            blob_hash, token, port, original_publisher_id, age = a
            result = self.node_rpc.store(sender_contact, blob_hash, token,
                                         port, original_publisher_id, age)
        elif method == b'findNode':
            key, = a
            result = self.node_rpc.find_node(sender_contact, key)
        else:
            assert method == b'findValue'
            key, = a
            result = self.node_rpc.find_value(sender_contact, key)

        await self.send_response(
            sender_contact,
            ResponseDatagram(RESPONSE_TYPE, message.rpc_id, self.node_id,
                             result),
        )