diff --git a/bjoern.py b/bjoern.py index 9d6fc4d6..09b3a663 100644 --- a/bjoern.py +++ b/bjoern.py @@ -1,3 +1,4 @@ +import atexit import os import socket import _bjoern @@ -38,6 +39,24 @@ def server_run(sock, wsgi_app): _bjoern.server_run(sock, wsgi_app) +def _close_server_socket(sock): + # Clean up the given socket + global _default_instance + + # This fix is only needed on *NIX-like systems + if sock.family == socket.AF_UNIX: + filename = sock.getsockname() + if filename[0] != '\0': + os.unlink(sock.getsockname()) + + # Close the socket, but wait for current connections to close first. + # Calling sock.shutdown({reason}) would force it to close, but that may not + # be wiae in al circumstances. + sock.close() + + _default_instance = None + + # Backwards compatibility API def listen(wsgi_app, host, port=None, reuse_port=False): """ @@ -52,6 +71,7 @@ def listen(wsgi_app, host, port=None, reuse_port=False): sock = bind_and_listen(host, port, reuse_port) _default_instance = (sock, wsgi_app) + def run(*args, **kwargs): """ run(*args, **kwargs): @@ -73,12 +93,10 @@ def run(*args, **kwargs): "before calling bjoern.run() without arguments.") sock, wsgi_app = _default_instance + atexit.register(_close_server_socket, sock) + try: server_run(sock, wsgi_app) finally: - if sock.family == socket.AF_UNIX: - filename = sock.getsockname() - if filename[0] != '\0': - os.unlink(sock.getsockname()) - sock.close() - _default_instance = None + _close_server_socket(sock) + atexit.unregister(sock) # Make sure we don't try to close the aocket twice