diff -r 031fc0231f3d Lib/asyncio/selector_events.py --- a/Lib/asyncio/selector_events.py Thu Jan 15 22:53:21 2015 +0100 +++ b/Lib/asyncio/selector_events.py Fri Jan 16 01:10:58 2015 +0100 @@ -23,6 +24,7 @@ from . import futures from . import selectors from . import transports from . import sslproto +from .coroutines import coroutine from .log import logger @@ -182,17 +184,30 @@ class BaseSelectorEventLoop(base_events. else: raise # The event loop will catch, log and ignore it. else: - protocol = protocol_factory() - if sslcontext: - self._make_ssl_transport( - conn, protocol, sslcontext, - server_side=True, extra={'peername': addr}, server=server) - else: - self._make_socket_transport( - conn, protocol , extra={'peername': addr}, - server=server) + coro = self._accept_connection2(protocol_factory, conn, addr, sslcontext, server) + self.create_task(coro) # It's now up to the protocol to handle the connection. + @coroutine + def _accept_connection2(self, protocol_factory, conn, addr, + sslcontext=None, server=None): + protocol = protocol_factory() + waiter = futures.Future(loop=self) + if sslcontext: + transport = self._make_ssl_transport( + conn, protocol, sslcontext, waiter=waiter, + server_side=True, extra={'peername': addr}, server=server) + else: + transport = self._make_socket_transport( + conn, protocol, waiter=waiter, extra={'peername': addr}, + server=server) + + try: + yield from waiter + except Exception as exc: + transport.close() + #raise + def add_reader(self, fd, callback, *args): """Add a reader callback.""" self._check_closed() diff -r 031fc0231f3d Lib/asyncio/sslproto.py --- a/Lib/asyncio/sslproto.py Thu Jan 15 22:53:21 2015 +0100 +++ b/Lib/asyncio/sslproto.py Fri Jan 16 01:10:58 2015 +0100 @@ -490,7 +504,11 @@ class SSLProtocol(protocols.Protocol): try: if self._loop.get_debug(): logger.debug("%r received EOF", self) - if not self._in_handshake: + if self._in_handshake: + exc = ValueError() + if self._waiter is not None and not self._waiter.cancelled(): + self._waiter.set_exception(exc) + elif not self._in_handshake: keep_open = self._app_protocol.eof_received() if keep_open: logger.warning('returning true from eof_received() '