1 # Copyright (C) 2009 Raul Jimenez
2 # Released under GNU LGPL 2.1
3 # See LICENSE.txt for more information
11 logger = logging.getLogger('dht')
14 class Responder(object ):
15 "docstring for Responder"
16 def __init__(self, my_id, routing_m, tracker, token_m):
18 self.routing_m = routing_m
19 self.tracker = tracker
20 self.token_m = token_m
21 self.query_handler = {message.PING: self._on_ping,
22 message.FIND_NODE: self._on_find_node,
23 message.GET_PEERS: self._on_get_peers,
24 message.ANNOUNCE_PEER: self._on_announce_peer,
26 self.notify_routing_m_on_query = None
28 def set_on_query_received_callback(self, callback_f):
29 self.notify_routing_m_on_query = callback_f
31 def on_query_received(self, query_msg, addr):
32 logger.debug('query received\n%s\nSource: %s' % (`query_msg`,
35 handler = self.query_handler[query_msg.query]
36 except (KeyError, ValueError):
37 logger.exception('Invalid QUERY')
38 return # ignore query #TODO2: send error back?
39 response_msg = handler(query_msg)
40 self.notify_routing_m_on_query(node.Node(addr,
45 def _on_ping(self, query_msg):
46 return message.OutgoingPingResponse(self.my_id)
48 def _on_find_node(self, query_msg):
49 rnodes = self.routing_m.get_closest_rnodes(query_msg.target)
50 return message.OutgoingFindNodeResponse(self.my_id,
53 def _on_get_peers(self, query_msg):
54 #get peers from the tracker (if any)
55 token = self.token_m.get()
56 peers = self.tracker.get(query_msg.info_hash)
58 return message.OutgoingGetPeersResponse(self.my_id,
61 rnodes = self.routing_m.get_closest_rnodes(query_msg.info_hash)
62 return message.OutgoingGetPeersResponse(self.my_id,
65 def _on_announce_peer(self, query_msg):
66 return message.OutgoingAnnouncePeerResponse(self.my_id)