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}")