Esempio n. 1
0
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
Esempio n. 2
0
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
Esempio n. 3
0
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
Esempio n. 4
0
 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))
Esempio n. 5
0
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 = [basic_coder.encode_address(peer)
                            for peer in response.peers]
        resp_dict['r']['values'] = "".join(encoded_peers)
    if response.token is not None:
        resp_dict['r']['token'] = basic_coder.ltob(response.token)
    return resp_dict
Esempio n. 6
0
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 = [
            basic_coder.encode_address(peer) for peer in response.peers
        ]
        resp_dict['r']['values'] = "".join(encoded_peers)
    if response.token is not None:
        resp_dict['r']['token'] = basic_coder.ltob(response.token)
    return resp_dict
Esempio n. 7
0
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