]> git.mxchange.org Git - quix0rs-apt-p2p.git/blobdiff - krpc.py
Make it also work from the command-line.
[quix0rs-apt-p2p.git] / krpc.py
diff --git a/krpc.py b/krpc.py
index 24a0f16c9a06f4c703f401bda85f473f2f4fd318..8a6009250e619f88606629d21c1d142ce61bad31 100644 (file)
--- a/krpc.py
+++ b/krpc.py
@@ -1,18 +1,16 @@
 ## Copyright 2002-2003 Andrew Loewenstern, All Rights Reserved
 # see LICENSE.txt for license information
 
-import airhook
-from twisted.internet.defer import Deferred
-from twisted.protocols import basic
 from bencode import bencode, bdecode
-from twisted.internet import protocol
+from time import asctime
+import sys
+from traceback import format_exception
 
+from twisted.internet.defer import Deferred
+from twisted.internet import protocol
 from twisted.internet import reactor
-import time
-
-import khash as hash
 
-KRPC_TIMEOUT = 60
+KRPC_TIMEOUT = 20
 
 KRPC_ERROR = 1
 KRPC_ERROR_METHOD_UNKNOWN = 2
@@ -20,16 +18,15 @@ KRPC_ERROR_RECEIVED_UNKNOWN = 3
 KRPC_ERROR_TIMEOUT = 4
 
 # commands
-TID = 'tid'
-REQ = 'req'
-RSP = 'rsp'
-TYP = 'typ'
-ARG = 'arg'
-ERR = 'err'
+TID = 't'
+REQ = 'q'
+RSP = 'r'
+TYP = 'y'
+ARG = 'a'
+ERR = 'e'
 
 class hostbroker(protocol.DatagramProtocol):       
     def __init__(self, server):
-        self.noisy = 0
         self.server = server
         # this should be changed to storage that drops old entries
         self.connections = {}
@@ -38,7 +35,7 @@ class hostbroker(protocol.DatagramProtocol):
         #print `addr`, `datagram`
         #if addr != self.addr:
         c = self.connectionForAddr(addr)
-        c.datagramReceived(datagram)
+        c.datagramReceived(datagram, addr)
         #if c.idle():
         #    del self.connections[addr]
 
@@ -65,15 +62,15 @@ class KRPC:
         self.factory = server
         self.addr = addr
         self.tids = {}
+        self.mtid = 0
 
-    def datagramReceived(self, str):
+    def datagramReceived(self, str, addr):
         # bdecode
         try:
             msg = bdecode(str)
         except Exception, e:
             if self.noisy:
                 print "response decode error: " + `e`
-            self.d.errback()
         else:
             #if self.noisy:
             #    print msg
@@ -83,15 +80,15 @@ class KRPC:
                 # if request
                 #      tell factory to handle
                 f = getattr(self.factory ,"krpc_" + msg[REQ], None)
+                msg[ARG]['_krpc_sender'] =  self.addr
                 if f and callable(f):
-                    msg[ARG]['_krpc_sender'] =  self.addr
                     try:
                         ret = apply(f, (), msg[ARG])
                     except Exception, e:
                         ## send error
-                        out = bencode({TID:msg[TID], TYP:ERR, ERR :`e`})
+                        out = bencode({TID:msg[TID], TYP:ERR, ERR :`format_exception(type(e), e, sys.exc_info()[2])`})
                         olen = len(out)
-                        self.transport.write(out, self.addr)
+                        self.transport.write(out, addr)
                     else:
                         if ret:
                             #  make response
@@ -100,7 +97,7 @@ class KRPC:
                             out = bencode({TID : msg[TID], TYP : RSP, RSP : {}})
                         #      send response
                         olen = len(out)
-                        self.transport.write(out, self.addr)
+                        self.transport.write(out, addr)
 
                 else:
                     if self.noisy:
@@ -108,9 +105,9 @@ class KRPC:
                     # unknown method
                     out = bencode({TID:msg[TID], TYP:ERR, ERR : KRPC_ERROR_METHOD_UNKNOWN})
                     olen = len(out)
-                    self.transport.write(out, self.addr)
+                    self.transport.write(out, addr)
                 if self.noisy:
-                    print "%s %s >>> %s - %s %s %s" % (time.asctime(), self.addr, self.factory.node.port, 
+                    print "%s %s >>> %s - %s %s %s" % (asctime(), addr, self.factory.node.port, 
                                                     ilen, msg[REQ], olen)
             elif msg[TYP] == RSP:
                 # if response
@@ -119,9 +116,9 @@ class KRPC:
                     df = self.tids[msg[TID]]
                     #  callback
                     del(self.tids[msg[TID]])
-                    df.callback({RSP : msg[RSP], '_krpc_sender': self.addr})
+                    df.callback({'rsp' : msg[RSP], '_krpc_sender': addr})
                 else:
-                    print 'timeout ' + `msg[RSP]['sender']`
+                    print 'timeout ' + `msg[RSP]['id']`
                     # no tid, this transaction timed out already...
             elif msg[TYP] == ERR:
                 # if error
@@ -145,7 +142,8 @@ class KRPC:
     def sendRequest(self, method, args):
         # make message
         # send it
-        msg = {TID : hash.newTID(), TYP : REQ,  REQ : method, ARG : args}
+        msg = {TID : chr(self.mtid), TYP : REQ,  REQ : method, ARG : args}
+        self.mtid = (self.mtid + 1) % 256
         str = bencode(msg)
         d = Deferred()
         self.tids[msg[TID]] = d