Thrift: Python support for Unix-domain sockets, and eager timeout setting.
Reviewed By: mcslee
Test Plan: Ran the test script.
Revert Plan: ok
Other Notes:
Contributed by Ben Maurer.
git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@665394 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/lib/py/src/transport/TSocket.py b/lib/py/src/transport/TSocket.py
index 0b44344..146820d 100644
--- a/lib/py/src/transport/TSocket.py
+++ b/lib/py/src/transport/TSocket.py
@@ -13,11 +13,21 @@
"""Socket implementation of TTransport base."""
- def __init__(self, host='localhost', port=9090):
+ def __init__(self, host='localhost', port=9090, unix_socket=None):
+ """Initialize a TSocket
+
+ @param host(str) The host to connect to.
+ @param port(int) The (TCP) port to connect to.
+ @param unix_socket(str) The filename of a unix socket to connect to.
+ (host and port will be ignored.)
+ """
+
self.host = host
self.port = port
self.handle = None
-
+ self._unix_socket = unix_socket
+ self._timeout = None
+
def setHandle(self, h):
self.handle = h
@@ -25,16 +35,26 @@
return self.handle != None
def setTimeout(self, ms):
- if (self.handle != None):
- self.handle.settimeout(ms/1000.00)
+ if ms is None:
+ self._timeout = None
else:
- raise TTransportException(TTransportException.NOT_OPEN, 'No handle yet in TSocket')
+ self._timeout = ms/1000.0
+
+ if (self.handle != None):
+ self.handle.settimeout(self._timeout)
+ def _resolveAddr(self):
+ if self._unix_socket is not None:
+ return [(socket.AF_UNIX, socket.SOCK_STREAM, None, None, self._unix_socket)]
+ else:
+ return socket.getaddrinfo(self.host, self.port, socket.AF_UNSPEC, socket.SOCK_STREAM, 0, socket.AI_PASSIVE | socket.AI_ADDRCONFIG)
+
def open(self):
try:
- res0 = socket.getaddrinfo(self.host, self.port, socket.AF_UNSPEC, socket.SOCK_STREAM, 0, socket.AI_PASSIVE | socket.AI_ADDRCONFIG)
+ res0 = self._resolveAddr()
for res in res0:
self.handle = socket.socket(res[0], res[1])
+ self.handle.settimeout(self._timeout)
try:
self.handle.connect(res[4])
except socket.error, e: