From d1aa4157e07ca7ae77949fabd549267f40686181 Mon Sep 17 00:00:00 2001 From: Antoine Millet Date: Tue, 4 Oct 2011 18:20:48 +0200 Subject: [PATCH] Added SSLRpcServer --- sjrpc/server/__init__.py | 4 ++-- sjrpc/server/simple.py | 31 ++++++++++++++++++++++++++++--- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/sjrpc/server/__init__.py b/sjrpc/server/__init__.py index 008fe18..2f0d379 100644 --- a/sjrpc/server/__init__.py +++ b/sjrpc/server/__init__.py @@ -3,6 +3,6 @@ from __future__ import absolute_import -from sjrpc.server.simple import (RpcServer, ) +from sjrpc.server.simple import (RpcServer, SSLRpcServer) -__all__ = ('RpcServer', ) +__all__ = ('RpcServer', 'SSLRpcServer') diff --git a/sjrpc/server/simple.py b/sjrpc/server/simple.py index ed1eca3..685cec8 100644 --- a/sjrpc/server/simple.py +++ b/sjrpc/server/simple.py @@ -42,19 +42,24 @@ class RpcServer(object): sock.listen(5) return cls(sock, *args, **kwargs) + def _wrap(self, sock): + ''' + Wrap the socket into the :class:`RpcConnection` and return it. + ''' + return RpcConnection(sock, self.loop, *self._conn_args, **self._conn_kw) + def _handle(self, watcher, revents): while True: try: sock, address = self._sock.accept() except socket.error as err: - if err.args[0] in self.NONBLOCKING_ERRORS: + if err.errno in self.NONBLOCKING_ERRORS: break else: raise #FIXME self.logger.info('New incoming connection from %s:%s', *address) - conn = RpcConnection(sock, self.loop, - *self._conn_args, **self._conn_kw) + conn = self._wrap(sock) self.register(conn) # @@ -97,3 +102,23 @@ class RpcServer(object): for client in self._clients.copy(): self.unregister(client, shutdown=True) self.loop.stop(pyev.EVBREAK_ALL) + + +class SSLRpcServer(RpcServer): + + ''' + SSL version of the RpcServer. + ''' + + def __init__(self, sock, certfile, keyfile, loop=None, *args, **kwargs): + super(SSLRpcServer, self).__init__(sock, loop, *args, **kwargs) + self._certfile = certfile + self._keyfile = keyfile + + def _wrap(self, sock): + sock = ssl.wrap_socket(sock, server_side=True, + keyfile=self._keyfile, + certfile=self._certfile, + ssl_version=ssl.PROTOCOL_TLSv1, + do_handshake_on_connect=True) + return super(SSLRpcServer, self)._wrap(sock) -- GitLab