def _query_decoder(rpc_dict): """ Decode the given KRPC dictionary into a valid Query @see decode @return krpc_types.Query """ q = Query() q._from = basic_coder.decode_network_id(rpc_dict['a']['id']) q.rpctype = rpctype = rpc_dict['q'] if rpctype == 'ping': pass elif rpctype == 'find_node': q.target_id = basic_coder.decode_network_id(rpc_dict['a']['target']) elif rpctype == 'get_peers': q.target_id = basic_coder.decode_network_id(rpc_dict['a']['info_hash']) elif rpctype == 'announce_peer': q.target_id = basic_coder.decode_network_id(rpc_dict['a']['info_hash']) # Try encoding the port (to ensure it is within range) basic_coder.encode_port(rpc_dict['a']['port']) q.port = rpc_dict['a']['port'] q.token = basic_coder.btol(rpc_dict['a']['token']) else: raise _ProtocolFormatError() return q
def decode_node(node_string): """ Decodes a network string into a Node object @see encode_node for the format of this network string """ node_id = basic_coder.decode_network_id(node_string[:20]) address = basic_coder.decode_address(node_string[20:]) return Node(node_id, address)
def _response_decoder(rpc_dict): """ Decode the given KRPC dictionary into a valid Response @see decode @return krpc_types.Response """ r = Response() # All responses have querier IDs r._from = basic_coder.decode_network_id(rpc_dict['r']['id']) # find_node always returns a list of nodes # get_peers sometimes returns a list of nodes if 'nodes' in rpc_dict['r']: r.nodes = _decode_nodes(rpc_dict['r']['nodes']) # get_peers always returns a list of peers if 'values' in rpc_dict['r']: r.peers = _decode_addresses(rpc_dict['r']['values']) # get_peers returns a token if 'token' in rpc_dict['r']: r.token = basic_coder.btol(rpc_dict['r']['token']) return r
def test_decode_network_id_validIDs(self): self.assertEquals(0, decode_network_id("\x00" * 20)) self.assertEquals(2**160 - 1, decode_network_id("\xff" * 20))