Python IPv6 support for TSocket

Summary: Contributed by Paul Saab of Powerset

Reviewed By: mcslee

Test Plan: Python test stuff


git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@665153 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/lib/py/src/transport/TSocket.py b/lib/py/src/transport/TSocket.py
index 280d6aa..e6168e2 100644
--- a/lib/py/src/transport/TSocket.py
+++ b/lib/py/src/transport/TSocket.py
@@ -30,8 +30,17 @@
 
   def open(self):
     try:
-      self.handle = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-      self.handle.connect((self.host, self.port))
+      res0 = socket.getaddrinfo(self.host, self.port, socket.AF_UNSPEC, socket.SOCK_STREAM)
+      for res in res0:
+        self.handle = socket.socket(res[0], res[1])
+        try:
+          self.handle.connect(res[4])
+        except socket.error, e:
+          if res is not res0[-1]:
+            continue
+          else:
+            raise e
+        break
     except socket.error, e:
       raise TTransportException(TTransportException.NOT_OPEN, 'Could not connect to %s:%d' % (self.host, self.port))
 
@@ -68,11 +77,16 @@
     self.handle = None
  
   def listen(self):
-    self.handle = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+    res0 = socket.getaddrinfo(None, self.port, socket.AF_UNSPEC, socket.SOCK_STREAM)
+    for res in res0:
+      if res[0] is socket.AF_INET6 or res is res0[-1]:
+        break
+
+    self.handle = socket.socket(res[0], res[1])
     self.handle.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
     if hasattr(self.handle, 'set_timeout'):
       self.handle.set_timeout(None)
-    self.handle.bind(('', self.port))
+    self.handle.bind(res[4])
     self.handle.listen(128)
 
   def accept(self):