diff --git a/proxy/core/base/tcp_server.py b/proxy/core/base/tcp_server.py index 38e969940d..e4e6c89d24 100644 --- a/proxy/core/base/tcp_server.py +++ b/proxy/core/base/tcp_server.py @@ -109,7 +109,11 @@ async def handle_writables(self, writables: Writables) -> bool: async def handle_readables(self, readables: Readables) -> bool: teardown = False if self.work.connection.fileno() in readables: - data = self.work.recv(self.flags.client_recvbuf_size) + try: + data = self.work.recv(self.flags.client_recvbuf_size) + except TimeoutError: + logger.info('Client recv timeout error') + return True if data is None: logger.debug( 'Connection closed by client {0}'.format( diff --git a/proxy/core/base/tcp_upstream.py b/proxy/core/base/tcp_upstream.py index 7bf4a01ad5..402a22e426 100644 --- a/proxy/core/base/tcp_upstream.py +++ b/proxy/core/base/tcp_upstream.py @@ -81,6 +81,9 @@ async def read_from_descriptors(self, r: Readables) -> bool: else: # Tear down because upstream proxy closed the connection return True + except TimeoutError: + logger.info('Upstream recv timeout error') + return True except ssl.SSLWantReadError: logger.info('Upstream SSLWantReadError, will retry') return False diff --git a/proxy/core/connection/pool.py b/proxy/core/connection/pool.py index 3fed38d5a7..0c9a108e7e 100644 --- a/proxy/core/connection/pool.py +++ b/proxy/core/connection/pool.py @@ -174,7 +174,10 @@ def _remove(self, fileno: int) -> None: """Remove a connection by descriptor from the internal data structure.""" conn = self.connections[fileno] logger.debug('Removing conn#{0} from pool'.format(id(conn))) - conn.connection.shutdown(socket.SHUT_WR) + try: + conn.connection.shutdown(socket.SHUT_WR) + except OSError: + pass conn.close() self.pools[conn.addr].remove(conn) del self.connections[fileno] diff --git a/proxy/http/websocket/client.py b/proxy/http/websocket/client.py index 018866d2a0..498df469bb 100644 --- a/proxy/http/websocket/client.py +++ b/proxy/http/websocket/client.py @@ -115,5 +115,8 @@ def run(self) -> None: finally: if not self.closed: self.selector.unregister(self.sock) - self.sock.shutdown(socket.SHUT_WR) + try: + self.sock.shutdown(socket.SHUT_WR) + except OSError: + pass self.sock.close()