Skip to content

Commit

Permalink
THRIFT-5777: python fix mismatched timeout exceptions
Browse files Browse the repository at this point in the history
Client: ["python"]
  • Loading branch information
bwangelme committed Apr 16, 2024
1 parent 68139d1 commit 0435e87
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 3 deletions.
4 changes: 2 additions & 2 deletions lib/py/src/transport/TSocket.py
Expand Up @@ -151,6 +151,8 @@ def open(self):
def read(self, sz):
try:
buff = self.handle.recv(sz)
except socket.timeout as e:
raise TTransportException(type=TTransportException.TIMED_OUT, message="read timeout", inner=e)
except socket.error as e:
if (e.args[0] == errno.ECONNRESET and
(sys.platform == 'darwin' or sys.platform.startswith('freebsd'))):
Expand All @@ -161,8 +163,6 @@ def read(self, sz):
self.close()
# Trigger the check to raise the END_OF_FILE exception below.
buff = ''
elif e.args[0] == errno.ETIMEDOUT:
raise TTransportException(type=TTransportException.TIMED_OUT, message="read timeout", inner=e)
else:
raise TTransportException(message="unexpected exception", inner=e)
if len(buff) == 0:
Expand Down
18 changes: 18 additions & 0 deletions lib/py/test/test_socket.py
Expand Up @@ -11,6 +11,24 @@


class TSocketTest(unittest.TestCase):
def test_socket_readtimeout_exception(self):
acc = ServerAcceptor(TServerSocket(port=0))
acc.start()

sock = TSocket(host="localhost", port=acc.port)
sock.open()
sock.setTimeout(1)
sock.write(b"sleep")

with self.assertRaises(TTransportException) as ctx:
sock.read(5)
exc = ctx.exception
self.assertEqual(exc.message, "read timeout")

acc.client.close() # this also blocks until the other thread is done
acc.close()
sock.close()

def test_isOpen_checks_for_readability(self):
# https://docs.python.org/3/library/socket.html#notes-on-socket-timeouts
# https://docs.python.org/3/library/socket.html#socket.socket.settimeout
Expand Down
5 changes: 4 additions & 1 deletion lib/py/test/test_sslsocket.py
Expand Up @@ -19,6 +19,7 @@

import inspect
import logging
import time
import os
import platform
import ssl
Expand Down Expand Up @@ -76,7 +77,9 @@ def run(self):
try:
self._client = self._server.accept()
if self._client:
self._client.read(5) # hello
data = self._client.read(5) # hello/sleep
if data == b"sleep":
time.sleep(2)
self._client.write(b"there")
except Exception:
logging.exception('error on server side (%s):' % self.name)
Expand Down

0 comments on commit 0435e87

Please sign in to comment.