summaryrefslogtreecommitdiffstats
path: root/module/remote
diff options
context:
space:
mode:
Diffstat (limited to 'module/remote')
-rw-r--r--module/remote/thriftbackend/Socket.py25
1 files changed, 22 insertions, 3 deletions
diff --git a/module/remote/thriftbackend/Socket.py b/module/remote/thriftbackend/Socket.py
index 33daab4c0..a492be59e 100644
--- a/module/remote/thriftbackend/Socket.py
+++ b/module/remote/thriftbackend/Socket.py
@@ -6,6 +6,8 @@ import errno
from thrift.transport.TSocket import TSocket, TServerSocket, TTransportException
+WantReadError = Exception #overwritten when ssl is used
+
class SecureSocketConnection:
def __init__(self, connection):
self.__dict__["connection"] = connection
@@ -22,6 +24,18 @@ class SecureSocketConnection:
def accept(self):
connection, address = self.__dict__["connection"].accept()
return SecureSocketConnection(connection), address
+
+ def send(self, buff):
+ try:
+ return self.__dict__["connection"].send(buff)
+ except WantReadError:
+ return self.send(buff)
+
+ def recv(self, buff):
+ try:
+ return self.__dict__["connection"].recv(buff)
+ except WantReadError:
+ return self.recv(buff)
class Socket(TSocket):
def __init__(self, host='localhost', port=7228, ssl=False):
@@ -31,8 +45,11 @@ class Socket(TSocket):
def open(self):
if self.ssl:
SSL = __import__("OpenSSL", globals(), locals(), "SSL", -1).SSL
+ WantReadError = SSL.WantReadError
ctx = SSL.Context(SSL.SSLv23_METHOD)
- self.handle = SecureSocketConnection(SSL.Connection(ctx, socket.socket(socket.AF_INET, socket.SOCK_STREAM)))
+ c = SSL.Connection(ctx, socket.socket(socket.AF_INET, socket.SOCK_STREAM))
+ c.set_connect_state()
+ self.handle = SecureSocketConnection(c)
else:
self.handle = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
@@ -67,7 +84,7 @@ class Socket(TSocket):
raise
if not len(buff):
- raise TTransportException(type=TTransportException.END_OF_FILE, message='TSocket read 0 bytes')
+ raise TTransportException(type=TTransportException.END_OF_FILE, message='TSocket read 0 bytes')
return buff
@@ -82,11 +99,13 @@ class ServerSocket(TServerSocket, Socket):
def listen(self):
if self.cert and self.key:
SSL = __import__("OpenSSL", globals(), locals(), "SSL", -1).SSL
+ WantReadError = SSL.WantReadError
ctx = SSL.Context(SSL.SSLv23_METHOD)
ctx.use_privatekey_file(self.key)
ctx.use_certificate_file(self.cert)
tmpConnection = SSL.Connection(ctx, socket.socket(socket.AF_INET, socket.SOCK_STREAM))
+ tmpConnection.set_accept_state()
self.handle = SecureSocketConnection(tmpConnection)
else:
@@ -95,7 +114,7 @@ class ServerSocket(TServerSocket, Socket):
self.handle.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
if hasattr(self.handle, 'set_timeout'):
- self.handle.set_timeout(None)
+ self.handle.set_timeout(None)
self.handle.bind((self.host, self.port))
self.handle.listen(128)