From 14c21b56de901d144300f24dcf37c430b1fd44b5 Mon Sep 17 00:00:00 2001 From: nocturn9x Date: Wed, 25 Mar 2020 07:40:01 +0000 Subject: [PATCH] Fixed the giambio.socket.AsyncSocket.connect() method --- giambio/core.py | 16 +++++++++------- giambio/socket.py | 7 +++++++ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/giambio/core.py b/giambio/core.py index 272a056..1b972d0 100644 --- a/giambio/core.py +++ b/giambio/core.py @@ -6,10 +6,10 @@ import socket from .exceptions import AlreadyJoinedError, CancelledError from timeit import default_timer from time import sleep as wait -from .socket import AsyncSocket +from .socket import AsyncSocket, WantRead, WantWrite from .traps import join, sleep, want_read, want_write, cancel from .abstractions import Task, Result - +from socket import SOL_SOCKET, SO_ERROR class EventLoop: @@ -157,9 +157,11 @@ class EventLoop: async def connect_sock(self, sock: socket.socket, addr: tuple): - try: - sock.connect(addr) - except BlockingIOError: + try: # "Borrowed" from curio + result = sock.connect(addr) + return result + except WantWrite: await want_write(sock) - - + err = sock.getsockopt(SOL_SOCKET, SO_ERROR) + if err != 0: + raise OSError(err, f'Connect call failed {addr}') diff --git a/giambio/socket.py b/giambio/socket.py index a4b5553..f98068b 100644 --- a/giambio/socket.py +++ b/giambio/socket.py @@ -6,6 +6,13 @@ Basic abstraction layer for giambio asynchronous sockets import socket +try: + from ssl import SSLWantReadError, SSLWantWriteError + WantRead = (BlockingIOError, InterruptedError, SSLWantReadError) + WantWrite = (BlockingIOError, InterruptedError, SSLWantWriteError) +except ImportError: + WantRead = (BlockingIOError, InterruptedError) + WantWrite = (BlockingIOError, InterruptedError) class AsyncSocket(object):