asyncio, Tulip issue 143: UNIX domain methods, fix ResourceWarning and

DeprecationWarning warnings. create_unix_server() closes the socket on any
error, not only on OSError.
This commit is contained in:
Victor Stinner 2014-02-19 01:45:59 +01:00
parent 0ee29c2c7f
commit 79a295261a
2 changed files with 19 additions and 17 deletions

View File

@ -183,12 +183,11 @@ class _UnixSelectorEventLoop(selector_events.BaseSelectorEventLoop):
raise ValueError( raise ValueError(
'path and sock can not be specified at the same time') 'path and sock can not be specified at the same time')
try:
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM, 0) sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM, 0)
try:
sock.setblocking(False) sock.setblocking(False)
yield from self.sock_connect(sock, path) yield from self.sock_connect(sock, path)
except OSError: except:
if sock is not None:
sock.close() sock.close()
raise raise
@ -213,6 +212,7 @@ class _UnixSelectorEventLoop(selector_events.BaseSelectorEventLoop):
try: try:
sock.bind(path) sock.bind(path)
except OSError as exc: except OSError as exc:
sock.close()
if exc.errno == errno.EADDRINUSE: if exc.errno == errno.EADDRINUSE:
# Let's improve the error message by adding # Let's improve the error message by adding
# with what exact address it occurs. # with what exact address it occurs.

View File

@ -221,16 +221,16 @@ class SelectorEventLoopUnixSocketTests(unittest.TestCase):
with test_utils.unix_socket_path() as path: with test_utils.unix_socket_path() as path:
sock = socket.socket(socket.AF_UNIX) sock = socket.socket(socket.AF_UNIX)
sock.bind(path) sock.bind(path)
with sock:
coro = self.loop.create_unix_server(lambda: None, path) coro = self.loop.create_unix_server(lambda: None, path)
with self.assertRaisesRegexp(OSError, with self.assertRaisesRegex(OSError,
'Address.*is already in use'): 'Address.*is already in use'):
self.loop.run_until_complete(coro) self.loop.run_until_complete(coro)
def test_create_unix_server_existing_path_nonsock(self): def test_create_unix_server_existing_path_nonsock(self):
with tempfile.NamedTemporaryFile() as file: with tempfile.NamedTemporaryFile() as file:
coro = self.loop.create_unix_server(lambda: None, file.name) coro = self.loop.create_unix_server(lambda: None, file.name)
with self.assertRaisesRegexp(OSError, with self.assertRaisesRegex(OSError,
'Address.*is already in use'): 'Address.*is already in use'):
self.loop.run_until_complete(coro) self.loop.run_until_complete(coro)
@ -248,8 +248,10 @@ class SelectorEventLoopUnixSocketTests(unittest.TestCase):
self.loop.run_until_complete(coro) self.loop.run_until_complete(coro)
def test_create_unix_server_path_inetsock(self): def test_create_unix_server_path_inetsock(self):
sock = socket.socket()
with sock:
coro = self.loop.create_unix_server(lambda: None, path=None, coro = self.loop.create_unix_server(lambda: None, path=None,
sock=socket.socket()) sock=sock)
with self.assertRaisesRegex(ValueError, with self.assertRaisesRegex(ValueError,
'A UNIX Domain Socket was expected'): 'A UNIX Domain Socket was expected'):
self.loop.run_until_complete(coro) self.loop.run_until_complete(coro)
@ -278,7 +280,7 @@ class SelectorEventLoopUnixSocketTests(unittest.TestCase):
coro = self.loop.create_unix_connection( coro = self.loop.create_unix_connection(
lambda: None, '/dev/null', ssl=True) lambda: None, '/dev/null', ssl=True)
with self.assertRaisesRegexp( with self.assertRaisesRegex(
ValueError, 'you have to pass server_hostname when using ssl'): ValueError, 'you have to pass server_hostname when using ssl'):
self.loop.run_until_complete(coro) self.loop.run_until_complete(coro)