Big Switch: Check source_address attribute exists

Check that the source_address attribute exists on
HTTPSConnection objects before referencing it since
it's not present on python 2.6 deployments. If it
does not exist, create a socket connection without
specifying the source.

Closes-Bug: #1316382
Change-Id: Ica10d23cc6de81ae56f711937f208c7321c77f36
This commit is contained in:
Kevin Benton 2014-05-08 16:33:06 -07:00
parent 83551bab6e
commit fd194e803f
2 changed files with 24 additions and 2 deletions

View File

@ -566,8 +566,13 @@ class HTTPSConnectionWithValidation(httplib.HTTPSConnection):
combined_cert = None
def connect(self):
sock = socket.create_connection((self.host, self.port),
self.timeout, self.source_address)
try:
sock = socket.create_connection((self.host, self.port),
self.timeout, self.source_address)
except AttributeError:
# python 2.6 doesn't have the source_address attribute
sock = socket.create_connection((self.host, self.port),
self.timeout)
if self._tunnel_host:
self.sock = sock
self._tunnel()

View File

@ -402,3 +402,20 @@ class ServerManagerTests(test_rp.BigSwitchProxyPluginV2TestCase):
self.assertEqual(con._tunnel_host, 'myproxy.local')
self.assertEqual(con._tunnel_port, 3128)
self.assertEqual(con.sock, self.wrap_mock())
class TestSockets(test_rp.BigSwitchProxyPluginV2TestCase):
def setUp(self):
super(TestSockets, self).setUp()
# http patch must not be running or it will mangle the servermanager
# import where the https connection classes are defined
self.httpPatch.stop()
self.sm = importutils.import_module(SERVERMANAGER)
def test_socket_create_attempt(self):
# exercise the socket creation to make sure it works on both python
# versions
con = self.sm.HTTPSConnectionWithValidation('127.0.0.1', 0, timeout=1)
# if httpcon was created, a connect attempt should raise a socket error
self.assertRaises(socket.error, con.connect)