+class KrpcRequest(Deferred):
+ """An outstanding request to a remote node.
+
+
+ """
+
+ def __init__(self, protocol, newTID, method, data, initDelay):
+ Deferred.__init__(self)
+ self.protocol = protocol
+ self.tid = newTID
+ self.method = method
+ self.data = data
+ self.delay = initDelay
+ self.later = None
+
+ def send(self):
+ self.later = reactor.callLater(self.delay, self.timeOut)
+ self.delay *= 2
+ self.protocol._sendData(self.method, self.data)
+
+ def timeOut(self):
+ """Call the deferred's errback if a timeout occurs."""
+ self.protocol._timeOut(self.tid, self.method)
+
+ def callback(self, resp):
+ self.dropTimeOut()
+ Deferred.callback(self, resp)
+
+ def errback(self, resp):
+ self.dropTimeOut()
+ Deferred.errback(self, resp)
+
+ def dropTimeOut(self):
+ """Cancel the timeout call when a response is received."""
+ if self.later and self.later.active():
+ self.later.cancel()
+