diff --git a/python2/httplib2/__init__.py b/python2/httplib2/__init__.py
index c87010c..05cb5cf 100644
--- a/python2/httplib2/__init__.py
+++ b/python2/httplib2/__init__.py
@@ -768,17 +768,33 @@
     def connect(self):
         "Connect to a host on a given (SSL) port."
 
-        if self.proxy_info and self.proxy_info.isgood():
-            sock = socks.socksocket(socket.AF_INET, socket.SOCK_STREAM)
-            sock.setproxy(*self.proxy_info.astuple())
-        else:
-            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-            sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
+        msg = "getaddrinfo returns an empty list"
+        for family, socktype, proto, canonname, sockaddr in socket.getaddrinfo(
+            self.host, self.port, 0, socket.SOCK_STREAM):
+            try:
+                if self.proxy_info and self.proxy_info.isgood():
+                    sock = socks.socksocket(family, socktype, proto)
+                    sock.setproxy(*self.proxy_info.astuple())
+                else:
+                    sock = socket.socket(family, socktype, proto)
+                    sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
 
-        if has_timeout(self.timeout):
-            sock.settimeout(self.timeout)
-        sock.connect((self.host, self.port))
-        self.sock =_ssl_wrap_socket(sock, self.key_file, self.cert_file)
+                if has_timeout(self.timeout):
+                    sock.settimeout(self.timeout)
+                sock.connect((self.host, self.port))
+                self.sock =_ssl_wrap_socket(sock, self.key_file, self.cert_file)
+                if self.debuglevel > 0:
+                    print "connect: (%s, %s)" % (self.host, self.port)
+            except socket.error, msg:
+              if self.debuglevel > 0:
+                  print 'connect fail:', (self.host, self.port)
+              if self.sock:
+                  self.sock.close()
+              self.sock = None
+              continue
+            break
+        if not self.sock:
+          raise socket.error, msg
 
 
 
diff --git a/python2/httplib2test.py b/python2/httplib2test.py
index 50222f2..1c5c49f 100755
--- a/python2/httplib2test.py
+++ b/python2/httplib2test.py
@@ -145,6 +145,24 @@
         self.http = httplib2.Http(cacheDirName)
         self.http.clear_credentials()
 
+    def testIPv6NoSSL(self):
+        try:
+          self.http.request("http://[::1]/")
+        except socket.gaierror:
+          self.fail("should get the address family right for IPv6")
+        except socket.error:
+          # Even if IPv6 isn't installed on a machine it should just raise socket.error
+          pass
+
+    def testIPv6SSL(self):
+        try:
+          self.http.request("https://[::1]/")
+        except socket.gaierror:
+          self.fail("should get the address family right for IPv6")
+        except socket.error:
+          # Even if IPv6 isn't installed on a machine it should just raise socket.error
+          pass
+
     def testConnectionType(self):
         self.http.force_exception_to_status_code = False 
         response, content = self.http.request("http://bitworking.org", connection_type=_MyHTTPConnection)
diff --git a/python3/httplib2/__init__.py b/python3/httplib2/__init__.py
index 07e05b4..02be175 100644
--- a/python3/httplib2/__init__.py
+++ b/python3/httplib2/__init__.py
@@ -750,17 +750,35 @@
     def connect(self):
         "Connect to a host on a given (SSL) port."
 
-        if self.proxy_info and self.proxy_info.isgood():
-            sock = socks.socksocket(socket.AF_INET, socket.SOCK_STREAM)
-            sock.setproxy(*self.proxy_info.astuple())
-        else:
-            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-            sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
-        if has_timeout(self.timeout):
-            sock.settimeout(self.timeout)
-        sock.connect((self.host, self.port))
-        self.sock = _ssl_wrap_socket(sock, self.key_file, self.cert_file)
+        msg = "getaddrinfo returns an empty list"
+        self.sock = None
+        for family, socktype, proto, canonname, sockaddr in socket.getaddrinfo(
+            self.host, self.port, 0, socket.SOCK_STREAM):
+            try:
+              if self.proxy_info and self.proxy_info.isgood():
+                  sock = socks.socksocket(family, socktype, proto)
+                  sock.setproxy(*self.proxy_info.astuple())
+              else:
+                  sock = socket.socket(family, socktype, proto)
+                  sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
 
+              if has_timeout(self.timeout):
+                  sock.settimeout(self.timeout)
+              sock.connect((self.host, self.port))
+              self.sock =_ssl_wrap_socket(sock, self.key_file, self.cert_file)
+              if self.debuglevel > 0:
+                  print("connect: (%s, %s)" % (self.host, self.port))
+            except socket.error as err:
+              if self.debuglevel > 0:
+                  print('connect fail:', (self.host, self.port))
+              if self.sock:
+                  self.sock.close()
+              self.sock = None
+              msg = err
+              continue
+            break
+        if self.sock is None:
+          raise socket.error(msg)
 
 
 class Http(object):
diff --git a/python3/httplib2test.py b/python3/httplib2test.py
index de473ac..86569ce 100755
--- a/python3/httplib2test.py
+++ b/python3/httplib2test.py
@@ -142,6 +142,24 @@
         self.http = httplib2.Http(cacheDirName)
         self.http.clear_credentials()
 
+    def testIPv6NoSSL(self):
+        try:
+          self.http.request("http://[::1]/")
+        except socket.gaierror:
+          self.fail("should get the address family right for IPv6")
+        except socket.error:
+          # Even if IPv6 isn't installed on a machine it should just raise socket.error
+          pass
+
+    def testIPv6SSL(self):
+        try:
+          self.http.request("https://[::1]/")
+        except socket.gaierror:
+          self.fail("should get the address family right for IPv6")
+        except socket.error:
+          # Even if IPv6 isn't installed on a machine it should just raise socket.error
+          pass
+
     def testConnectionType(self):
         self.http.force_exception_to_status_code = False 
         response, content = self.http.request("http://bitworking.org", connection_type=_MyHTTPConnection)
