You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@thrift.apache.org by dr...@apache.org on 2010/08/30 23:57:07 UTC

svn commit: r990955 - /incubator/thrift/trunk/lib/py/src/transport/TSocket.py

Author: dreiss
Date: Mon Aug 30 21:57:07 2010
New Revision: 990955

URL: http://svn.apache.org/viewvc?rev=990955&view=rev
Log:
THRIFT-869. python: Disguise ECONNRESET as EOF on BSD

Modified:
    incubator/thrift/trunk/lib/py/src/transport/TSocket.py

Modified: incubator/thrift/trunk/lib/py/src/transport/TSocket.py
URL: http://svn.apache.org/viewvc/incubator/thrift/trunk/lib/py/src/transport/TSocket.py?rev=990955&r1=990954&r2=990955&view=diff
==============================================================================
--- incubator/thrift/trunk/lib/py/src/transport/TSocket.py (original)
+++ incubator/thrift/trunk/lib/py/src/transport/TSocket.py Mon Aug 30 21:57:07 2010
@@ -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