Hi,
I have some little suggestions for server.py.
The first is rather trivial. It would be nice to see in the logs who
has used the server. Of course one can create an additional log entry
when the service starts, but I think it is nicer if it is included in
Server._serve_client().
def _serve_client(self, sock, credentials):
h, p = sock.getpeername()
#{{ my modification
if (type(credentials)!=type('')) or (credentials==''):
self.logger.info("welcome %s:%s", h, p)
else:
self.logger.info("welcome %s [%s:%s]", credentials, h, p)
#}}
try:
config = dict(self.protocol_config, credentials =
credentials)
conn = Connection(self.service,
Channel(SocketStream(sock)),
config = config, _lazy = True)
conn._init_service()
conn.serve_all()
finally:
self.logger.info("goodbye %s:%s", h, p)
My second suggestion involves Server._authenticate_and_serve_client().
If I run the server under Linux,
I observed that tlslite raises an exception if the client does not
properly closes the connection. This does not happen if I run the
server under windows. Therefore I suggest to add some error handling
around the call of _serve_client() and log the exception and the
traceback properly.
def _authenticate_and_serve_client(self, sock):
try:
if self.authenticator:
h, p = sock.getpeername()
try:
sock, credentials = self.authenticator(sock)
except AuthenticationError:
self.logger.info("%s:%s failed to authenticate,
rejecting connection", h, p)
return
else:
self.logger.info("%s:%s authenticated
successfully", h, p)
else:
credentials = None
#{{ my modification
try:
self._serve_client(sock, credentials)
except Exception,e:
etype = sys.exc_type
excinfo = sys.exc_info()
try:
ename = etype.__name__
except AttributeError:
ename = etype
self.logger.warn("Exception: %s",ename)
self.logger.traceback(excinfo)
#}}
finally:
try:
sock.shutdown(socket.SHUT_RDWR)
except Exception:
pass
sock.close()
self.clients.discard(sock)
Greetings
Ruediger