synchronous_get batch method for interface
[electrum-nvc.git] / lib / interface.py
index 1240720..9edfff0 100644 (file)
@@ -110,7 +110,7 @@ class InterfaceAncestor(threading.Thread):
                 result = params[1]
                 params = [addr]
 
-        self.responses.put({'method':method, 'params':params, 'result':result})
+        self.responses.put({'method':method, 'params':params, 'result':result, 'id':msg_id})
 
 
 
@@ -130,7 +130,7 @@ class HttpStratumInterface(InterfaceAncestor):
     def __init__(self, host, port, proxy=None, use_ssl=True):
         InterfaceAncestor.__init__(self, host, port, proxy, use_ssl)
         self.session_id = None
-        self.connection_msg = "http://%s:%d"%(self.host,self.port)
+        self.connection_msg = ('https' if self.use_ssl else 'http') + '://%s:%d'%( self.host, self.port )
 
     def get_history(self, address):
         self.send([('blockchain.address.get_history', [address] )])
@@ -185,16 +185,12 @@ class HttpStratumInterface(InterfaceAncestor):
             # poll with GET
             data_json = None 
 
-        if self.use_ssl:
-            host = 'https://%s:%d'%( self.host, self.port )
-        else:
-            host = 'http://%s:%d'%( self.host, self.port )
             
         headers = {'content-type': 'application/json'}
         if self.session_id:
             headers['cookie'] = 'SESSION=%s'%self.session_id
 
-        req = urllib2.Request(host, data_json, headers)
+        req = urllib2.Request(self.connection_msg, data_json, headers)
         response_stream = urllib2.urlopen(req)
 
         for index, cookie in enumerate(cj):
@@ -290,21 +286,22 @@ class TcpStratumInterface(InterfaceAncestor):
         self.poke()
 
     def send(self, messages):
+        """return the ids of the requests that we sent"""
         out = ''
+        ids = []
         for m in messages:
             method, params = m 
             request = json.dumps( { 'id':self.message_id, 'method':method, 'params':params } )
             self.unanswered_requests[self.message_id] = method, params
-
+            ids.append(self.message_id)
             # uncomment to debug
             # print "-->",request
-
             self.message_id += 1
             out += request + '\n'
-
         while out:
             sent = self.s.send( out )
             out = out[sent:]
+        return ids
 
     def get_history(self, addr):
         self.send([('blockchain.address.get_history', [addr])])
@@ -344,9 +341,9 @@ class Interface(TcpStratumInterface, HttpStratumInterface):
 
     def send(self, messages):
         if self.protocol in 'st':
-            TcpStratumInterface.send(self, messages)
+            return TcpStratumInterface.send(self, messages)
         else:
-            HttpStratumInterface.send(self, messages)
+            return HttpStratumInterface.send(self, messages)
 
 
     def parse_proxy_options(self, s):
@@ -382,10 +379,26 @@ class Interface(TcpStratumInterface, HttpStratumInterface):
             self.is_connected = False  # this exits the polling loop
             self.poke()
 
+
     def is_up_to_date(self):
         return self.responses.empty() and not self.unanswered_requests
 
 
+    def synchronous_get(self, requests, timeout=100000000):
+        # todo: use generators, unanswered_requests should be a list of arrays...
+        ids = self.send(requests)
+        id2 = ids[:]
+        res = {}
+        while ids:
+            r = self.responses.get(True, timeout)
+            _id = r.get('id')
+            if _id in ids:
+                ids.remove(_id)
+                res[_id] = r.get('result')
+        out = []
+        for _id in id2:
+            out.append(res[_id])
+        return out