From 50b4a9a6c22ecdcc16f0859fb98e6ec50a50eaaf Mon Sep 17 00:00:00 2001 From: Raul Jimenez Date: Wed, 11 Jan 2012 16:10:07 +0100 Subject: [PATCH] responder separated from controller (first step for #36) --- core/responder.py | 54 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 core/responder.py diff --git a/core/responder.py b/core/responder.py new file mode 100644 index 0000000..e5c481d --- /dev/null +++ b/core/responder.py @@ -0,0 +1,54 @@ +""" +This is the server part of the node, where queries are parsed and responses +created. + +""" +import logging, logging_conf + +import message +import tracker +import token_manager + +logger = logging.getLogger('dht') + +NUM_NODES = 8 + +class Responder(object): + + def __init__(self, my_id, routing_m, msg_f): + self._my_id = my_id + self._routing_m = routing_m + self.msg_f = msg_f + self._tracker = tracker.Tracker() + self._token_m = token_manager.TokenManager() + + def get_response(self, msg): + if msg.query == message.PING: + return self.msg_f.outgoing_ping_response(msg.src_node) + elif msg.query == message.FIND_NODE: + log_distance = msg.target.log_distance(self._my_id) + rnodes = self._routing_m.get_closest_rnodes(log_distance, + NUM_NODES, False) + #TODO: return the closest rnodes to the target instead of the 8 + #first in the bucket. + return self.msg_f.outgoing_find_node_response( + msg.src_node, rnodes) + elif msg.query == message.GET_PEERS: + token = self._token_m.get() + log_distance = msg.info_hash.log_distance(self._my_id) + rnodes = self._routing_m.get_closest_rnodes(log_distance, + NUM_NODES, False) + #TODO: return the closest rnodes to the target instead of the 8 + #first in the bucket. + peers = self._tracker.get(msg.info_hash) + if peers: + logger.debug('RESPONDING with PEERS:\n%r' % peers) + return self.msg_f.outgoing_get_peers_response( + msg.src_node, token, nodes=rnodes, peers=peers) + elif msg.query == message.ANNOUNCE_PEER: + peer_addr = (msg.src_addr[0], msg.bt_port) + self._tracker.put(msg.info_hash, peer_addr) + return self.msg_f.outgoing_announce_peer_response(msg.src_node) + else: + logger.debug('Invalid QUERY: %r' % (msg.query)) + #TODO: maybe send an error back?