add delay if tcp session cannot be started
[electrum-server.git] / transports / stratum_tcp.py
index 0aebc0f..8e28a57 100644 (file)
@@ -1,16 +1,17 @@
 import json
+import Queue as queue
 import socket
 import threading
 import time
-import Queue as queue
 
-from processor import Session, Dispatcher, timestr
+from processor import Session, Dispatcher
+from utils import print_log
+
 
 class TcpSession(Session):
 
     def __init__(self, connection, address, use_ssl, ssl_certfile, ssl_keyfile):
         Session.__init__(self)
-        print connection, address, use_ssl
         if use_ssl:
             import ssl
             self._connection = ssl.wrap_socket(
@@ -23,7 +24,7 @@ class TcpSession(Session):
             self._connection = connection
 
         self.address = address[0]
-        self.name = "TCP"
+        self.name = "TCP " if not use_ssl else "SSL "
 
     def connection(self):
         if self.stopped():
@@ -51,7 +52,6 @@ class TcpSession(Session):
             self.stop()
 
 
-
 class TcpClientRequestor(threading.Thread):
 
     def __init__(self, dispatcher, session):
@@ -94,7 +94,7 @@ class TcpClientRequestor(threading.Thread):
 
         raw_command = self.message[0:raw_buffer].strip()
         self.message = self.message[raw_buffer + 1:]
-        if raw_command == 'quit': 
+        if raw_command == 'quit':
             self.session.stop()
             return False
 
@@ -113,10 +113,11 @@ class TcpClientRequestor(threading.Thread):
             # Return an error JSON in response.
             self.dispatcher.push_response({"error": "syntax error", "request": raw_command})
         else:
-            self.dispatcher.push_request(self.session,command)
+            self.dispatcher.push_request(self.session, command)
 
         return True
 
+
 class TcpServer(threading.Thread):
 
     def __init__(self, dispatcher, host, port, use_ssl, ssl_certfile, ssl_keyfile):
@@ -132,15 +133,23 @@ class TcpServer(threading.Thread):
         self.ssl_certfile = ssl_certfile
 
     def run(self):
-        print "TCP server started.", self.use_ssl
+        if self.use_ssl:
+            print_log("TCP/SSL server started.")
+        else:
+            print_log("TCP server started.")
         sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
         sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
         sock.bind((self.host, self.port))
         sock.listen(1)
         while not self.shared.stopped():
-            session = TcpSession(*sock.accept(), use_ssl=self.use_ssl, ssl_certfile=self.ssl_certfile, ssl_keyfile=self.ssl_keyfile)
+            try:
+                session = TcpSession(*sock.accept(), use_ssl=self.use_ssl, ssl_certfile=self.ssl_certfile, ssl_keyfile=self.ssl_keyfile)
+            except BaseException, e:
+                error = str(e)
+                print_log("cannot start TCP session", error)
+                time.sleep(0.1)
+                continue
             self.dispatcher.add_session(session)
             self.dispatcher.collect_garbage()
             client_req = TcpClientRequestor(self.dispatcher, session)
             client_req.start()
-