def _encode(message): """@see encode""" intermediate_msg = {} # Encode and attach the transaction id intermediate_msg['t'] = (basic_coder.ltob(message._transaction_id)) # Determine the type of this KRPC if isinstance(message, Query): intermediate_msg['y'] = 'q' elif isinstance(message, Response): intermediate_msg['y'] = 'r' elif isinstance(message, Error): intermediate_msg['y'] = 'e' else: raise _ProtocolFormatError() message_encoders = { 'q': _query_encoder, 'r': _response_encoder, 'e': _error_encoder } # Add the additional Query/Response/Error # data onto the message addition = message_encoders[intermediate_msg['y']](message) intermediate_msg.update(addition) # Bencode the KRPC dictionary encoded_msg = bencode(intermediate_msg) return encoded_msg
def _query_encoder(query): """@see encode""" query_dict = { "q": query.rpctype, "a": { "id": basic_coder.encode_network_id(query._from) } } # Perform specific rpc encoding if query.rpctype == 'ping': pass elif query.rpctype == 'find_node': query_dict['a']['target'] = (basic_coder.encode_network_id( query.target_id)) elif query.rpctype == 'get_peers': query_dict['a']['info_hash'] = (basic_coder.encode_network_id( query.target_id)) elif query.rpctype == 'announce_peer': query_dict['a']['token'] = basic_coder.ltob(query.token) # Try encoding the port, to see if it is within range basic_coder.encode_port(query.port) query_dict['a']['port'] = query.port query_dict['a']['info_hash'] = (basic_coder.encode_network_id( query.target_id)) else: raise _ProtocolFormatError() return query_dict
def _encode(message): """@see encode""" intermediate_msg = {} # Encode and attach the transaction id intermediate_msg['t'] = ( basic_coder.ltob(message._transaction_id)) # Determine the type of this KRPC if isinstance(message, Query): intermediate_msg['y'] = 'q' elif isinstance(message, Response): intermediate_msg['y'] = 'r' elif isinstance(message, Error): intermediate_msg['y'] = 'e' else: raise _ProtocolFormatError() message_encoders = {'q': _query_encoder, 'r': _response_encoder, 'e': _error_encoder}; # Add the additional Query/Response/Error # data onto the message addition = message_encoders[intermediate_msg['y']](message) intermediate_msg.update(addition) # Bencode the KRPC dictionary encoded_msg = bencode(intermediate_msg) return encoded_msg
def test_ltob_and_btol(self): bijection = lambda num: btol(ltob(num)) self.assertEqual(0, bijection(0)) self.assertEqual(512, bijection(512)) self.assertEqual(1024, bijection(1024)) self.assertEqual(9120890186313616, bijection(9120890186313616)) self.assertEqual(2**150, bijection(2**150)) self.assertEqual(2**133, bijection(2**133))
def _response_encoder(response): """@see encode""" resp_dict = {"r": {"id": basic_coder.encode_network_id(response._from)}} if response.nodes is not None: encoded_nodes = [contact.encode_node(node) for node in response.nodes] resp_dict['r']['nodes'] = "".join(encoded_nodes) if response.peers is not None: encoded_peers = map(basic_coder.encode_address, response.peers) resp_dict['r']['values'] = encoded_peers if response.token is not None: resp_dict['r']['token'] = basic_coder.ltob(response.token) return resp_dict
def _query_encoder(query): """@see encode""" query_dict = {"q": query.rpctype, "a": { "id": basic_coder.encode_network_id(query._from)}} # Perform specific rpc encoding if query.rpctype == 'ping': pass elif query.rpctype == 'find_node': query_dict['a']['target'] = ( basic_coder.encode_network_id(query.target_id)) elif query.rpctype == 'get_peers': query_dict['a']['info_hash'] = ( basic_coder.encode_network_id(query.target_id)) elif query.rpctype == 'announce_peer': query_dict['a']['token'] = basic_coder.ltob(query.token) # Try encoding the port, to see if it is within range basic_coder.encode_port(query.port) query_dict['a']['port'] = query.port query_dict['a']['info_hash'] = ( basic_coder.encode_network_id(query.target_id)) else: raise _ProtocolFormatError() return query_dict