From 1b9e9926ff6b79f20c836bf7f7867cfc85f47fbb Mon Sep 17 00:00:00 2001 From: Antoine Millet Date: Tue, 4 Oct 2011 11:08:47 +0200 Subject: [PATCH] Enhanced socket read error handling --- sjrpc/core/rpcconnection.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/sjrpc/core/rpcconnection.py b/sjrpc/core/rpcconnection.py index 2ea587e..21e06bb 100644 --- a/sjrpc/core/rpcconnection.py +++ b/sjrpc/core/rpcconnection.py @@ -7,6 +7,7 @@ class are located in it docstring. from __future__ import absolute_import import ssl +import errno import struct import socket import logging @@ -52,6 +53,9 @@ class RpcConnection(object): automatically registered on label 0. ''' + NONBLOCKING_ERRORS = (errno.EAGAIN, errno.EWOULDBLOCK) + NONBLOCKING_SSL_ERRORS = (ssl.SSL_ERROR_WANT_READ) + MESSAGE_HEADER = '!HL' MESSAGE_HEADER_FALLBACK = '!L' MAX_LABEL = 2 ** 16 @@ -189,8 +193,18 @@ class RpcConnection(object): handler. ''' # Try to received remaining data from the socket: - buf = self._sock.recv(self._remains) if buf == '': + try: + buf = self._sock.recv(self._remains) + except socket.error as err: + if (isinstance(err, socket.error) and err.errno + in RpcConnection.NONBLOCKING_ERRORS): + return + elif (isinstance(err, ssl.SSLError) and err.errno + in RpcConnection.NONBLOCKING_SSL_ERRORS): + return + else: + raise self.shutdown() self._remains -= len(buf) -- GitLab