From: David Reiss Date: Mon, 30 Aug 2010 21:57:07 +0000 (+0000) Subject: THRIFT-869. python: Disguise ECONNRESET as EOF on BSD X-Git-Tag: 0.5.0~149 X-Git-Url: https://source.supwisdom.com/gerrit/gitweb?a=commitdiff_plain;h=73af3b7c4c3b3d71c12544ed800ec9b1c537c783;p=common%2Fthrift.git THRIFT-869. python: Disguise ECONNRESET as EOF on BSD git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@990955 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/lib/py/src/transport/TSocket.py b/lib/py/src/transport/TSocket.py index 87119612..d77e358a 100644 --- a/lib/py/src/transport/TSocket.py +++ b/lib/py/src/transport/TSocket.py @@ -21,6 +21,7 @@ from TTransport import * import os import errno import socket +import sys class TSocketBase(TTransportBase): def _resolveAddr(self): @@ -89,7 +90,20 @@ class TSocket(TSocketBase): raise TTransportException(type=TTransportException.NOT_OPEN, message=message) def read(self, sz): - buff = self.handle.recv(sz) + try: + buff = self.handle.recv(sz) + except socket.error, e: + if (e.args[0] == errno.ECONNRESET and + (sys.platform == 'darwin' or sys.platform.startswith('freebsd'))): + # freebsd and Mach don't follow POSIX semantic of recv + # and fail with ECONNRESET if peer performed shutdown. + # See corresponding comment and code in TSocket::read() + # in lib/cpp/src/transport/TSocket.cpp. + self.close() + # Trigger the check to raise the END_OF_FILE exception below. + buff = '' + else: + raise if len(buff) == 0: raise TTransportException(type=TTransportException.END_OF_FILE, message='TSocket read 0 bytes') return buff