Further fixes for issue 96. Adds tests and also fixes it for Python 3
diff --git a/python2/httplib2/__init__.py b/python2/httplib2/__init__.py
index f01e931..2b4848f 100644
--- a/python2/httplib2/__init__.py
+++ b/python2/httplib2/__init__.py
@@ -871,7 +871,12 @@
                 conn.close()
                 raise ServerNotFoundError("Unable to find the server at %s" % conn.host)
             except socket.error, e:
-                if e.errno == errno.ECONNREFUSED: # Connection refused
+                err = 0
+                if hasattr(e, 'args'):
+                    err = getattr(e, 'args')[0]
+                else:
+                    err = e.errno
+                if err == errno.ECONNREFUSED: # Connection refused
                     raise
             except httplib.HTTPException:
                 # Just because the server closed the connection doesn't apparently mean
diff --git a/python2/httplib2test.py b/python2/httplib2test.py
index 5a81a70..50222f2 100755
--- a/python2/httplib2test.py
+++ b/python2/httplib2test.py
@@ -15,15 +15,16 @@
 __version__ = "0.1 ($Rev: 118 $)"
 
 
-import sys
-import unittest
+import StringIO
+import base64
 import httplib
 import httplib2
 import os
-import urlparse
+import socket
+import sys
 import time
-import base64
-import StringIO
+import unittest
+import urlparse
 
 # Python 2.3 support
 if not hasattr(unittest.TestCase, 'assertTrue'):
@@ -166,6 +167,22 @@
         self.assertTrue(content.startswith("Unable to find"))
         self.assertEqual(response.status, 400)
 
+    def testGetConnectionRefused(self):
+        self.http.force_exception_to_status_code = False
+        try:
+          self.http.request("http://localhost:7777/")
+          self.fail("An socket.error exception must be thrown on Connection Refused.")
+        except socket.error:
+            pass
+
+        # Now test with exceptions turned off
+        self.http.force_exception_to_status_code = True
+
+        (response, content) = self.http.request("http://localhost:7777/")
+        self.assertEqual(response['content-type'], 'text/plain')
+        self.assertTrue("Connection refused" in content)
+        self.assertEqual(response.status, 400)
+
     def testGetIRI(self):
         if sys.version_info >= (2,3):
             uri = urlparse.urljoin(base, u"reflector/reflector.cgi?d=\N{CYRILLIC CAPITAL LETTER DJE}")
diff --git a/python3/httplib2/__init__.py b/python3/httplib2/__init__.py
index 5ca8c3a..b25b9c8 100644
--- a/python3/httplib2/__init__.py
+++ b/python3/httplib2/__init__.py
@@ -855,7 +855,19 @@
                 errno_ = (e.args[0].errno if isinstance(e.args[0], socket.error) else e.errno)
                 if errno_ == errno.ECONNREFUSED: # Connection refused
                     raise
-            except httplib.HTTPException:
+            except http.client.HTTPException:
+                if conn.sock is None:
+                    if i == 0:
+                        conn.close()
+                        conn.connect()
+                        continue
+                    else:
+                        conn.close()
+                        raise
+                if i == 0:
+                    conn.close()
+                    conn.connect()
+                    continue
                 # Just because the server closed the connection doesn't apparently mean
                 # that the server didn't send a response.
                 pass
diff --git a/python3/httplib2test.py b/python3/httplib2test.py
index 264677c..de473ac 100755
--- a/python3/httplib2test.py
+++ b/python3/httplib2test.py
@@ -14,16 +14,16 @@
 __history__ = """ """

 __version__ = "0.2 ($Rev: 118 $)"

 

-

-import sys

-import unittest

+import base64

 import http.client

 import httplib2

-import os

-import urllib.parse

-import time

-import base64

 import io

+import os

+import socket

+import sys

+import time

+import unittest

+import urllib.parse

 

 # The test resources base uri

 base = 'http://bitworking.org/projects/httplib2/test/'

@@ -164,6 +164,22 @@
         self.assertTrue(content.startswith(b"Unable to find"))

         self.assertEqual(response.status, 400)

 

+    def testGetConnectionRefused(self):

+        self.http.force_exception_to_status_code = False

+        try:

+            self.http.request("http://localhost:7777/")

+            self.fail("An socket.error exception must be thrown on Connection Refused.")

+        except socket.error:

+            pass

+

+        # Now test with exceptions turned off

+        self.http.force_exception_to_status_code = True

+

+        (response, content) = self.http.request("http://localhost:7777/")

+        self.assertEqual(response['content-type'], 'text/plain')

+        self.assertTrue(b"Connection refused" in content)

+        self.assertEqual(response.status, 400)

+

     def testGetIRI(self):

         if sys.version_info >= (2,3):

             uri = urllib.parse.urljoin(base, "reflector/reflector.cgi?d=\N{CYRILLIC CAPITAL LETTER DJE}")