add timeout for http sessions
[electrum-server.git] / transports / stratum_http.py
index d628df7..8118478 100644 (file)
@@ -22,7 +22,7 @@ import SimpleXMLRPCServer
 import SocketServer
 import socket
 import logging
-import os
+import os, time
 import types
 import traceback
 import sys, threading
@@ -97,6 +97,11 @@ class StratumJSONRPCDispatcher(SimpleXMLRPCServer.SimpleXMLRPCDispatcher):
             response = fault.response()
             return response
 
+        session = self.dispatcher.get_session_by_address(session_id)
+        if not session:
+            return 'Error: session not found'
+        session.time = time.time()
+
         responses = []
         if type(request) is not types.ListType:
             request = [ request ]
@@ -107,13 +112,12 @@ class StratumJSONRPCDispatcher(SimpleXMLRPCServer.SimpleXMLRPCDispatcher):
                 responses.append(result.response())
                 continue
 
-            session = self.sessions.get(session_id)
             self.dispatcher.process(session, req_entry)
                 
             if req_entry['method'] == 'server.stop':
                 return json.dumps({'result':'ok'})
 
-        r = self.poll_session(session_id)
+        r = self.poll_session(session)
         for item in r:
             responses.append(json.dumps(item))
             
@@ -254,16 +258,16 @@ class StratumJSONRPCServer(SocketServer.TCPServer, StratumJSONRPCDispatcher):
             flags |= fcntl.FD_CLOEXEC
             fcntl.fcntl(self.fileno(), fcntl.F_SETFD, flags)
 
-        self.sessions = {}
 
 
     def create_session(self):
         session_id = random_string(10)
-        self.sessions[session_id] = HttpSession(session_id)
+        session = HttpSession(session_id)
+        self.dispatcher.add_session(session)
         return session_id
 
-    def poll_session(self, session_id):
-        q = self.sessions[session_id].pending_responses
+    def poll_session(self, session):
+        q = session.pending_responses
         responses = []
         while not q.empty():
             r = q.get()
@@ -287,6 +291,12 @@ class HttpSession(Session):
         raw_response = json.dumps(response)
         self.pending_responses.put(response)
 
+    def stopped(self):
+        with self.lock:
+            if time.time() - self.time > 60:
+                self._stopped = True
+            return self._stopped
+
 class HttpServer(threading.Thread):
     def __init__(self, dispatcher, host, port):
         self.shared = dispatcher.shared