found a error condition in swift.common.client where the resp would not be consumed, added tests and fixed
This commit is contained in:
@@ -164,6 +164,7 @@ def get_auth(url, user, key, snet=False):
|
|||||||
conn.request('GET', parsed.path, '',
|
conn.request('GET', parsed.path, '',
|
||||||
{'X-Auth-User': user, 'X-Auth-Key': key})
|
{'X-Auth-User': user, 'X-Auth-Key': key})
|
||||||
resp = conn.getresponse()
|
resp = conn.getresponse()
|
||||||
|
resp.read()
|
||||||
if resp.status < 200 or resp.status >= 300:
|
if resp.status < 200 or resp.status >= 300:
|
||||||
raise ClientException('Auth GET failed', http_scheme=parsed.scheme,
|
raise ClientException('Auth GET failed', http_scheme=parsed.scheme,
|
||||||
http_host=conn.host, http_port=conn.port,
|
http_host=conn.host, http_port=conn.port,
|
||||||
@@ -246,6 +247,7 @@ def head_account(url, token, http_conn=None):
|
|||||||
parsed, conn = http_connection(url)
|
parsed, conn = http_connection(url)
|
||||||
conn.request('HEAD', parsed.path, '', {'X-Auth-Token': token})
|
conn.request('HEAD', parsed.path, '', {'X-Auth-Token': token})
|
||||||
resp = conn.getresponse()
|
resp = conn.getresponse()
|
||||||
|
resp.read()
|
||||||
if resp.status < 200 or resp.status >= 300:
|
if resp.status < 200 or resp.status >= 300:
|
||||||
raise ClientException('Account HEAD failed', http_scheme=parsed.scheme,
|
raise ClientException('Account HEAD failed', http_scheme=parsed.scheme,
|
||||||
http_host=conn.host, http_port=conn.port,
|
http_host=conn.host, http_port=conn.port,
|
||||||
|
|||||||
@@ -153,6 +153,14 @@ class MockHttpTest(unittest.TestCase):
|
|||||||
def request(*args, **kwargs):
|
def request(*args, **kwargs):
|
||||||
return
|
return
|
||||||
conn.request = request
|
conn.request = request
|
||||||
|
|
||||||
|
conn.has_been_read = False
|
||||||
|
_orig_read = conn.read
|
||||||
|
def read(*args, **kwargs):
|
||||||
|
conn.has_been_read = True
|
||||||
|
return _orig_read(*args, **kwargs)
|
||||||
|
conn.read = read
|
||||||
|
|
||||||
return parsed, conn
|
return parsed, conn
|
||||||
return wrapper
|
return wrapper
|
||||||
self.fake_http_connection = fake_http_connection
|
self.fake_http_connection = fake_http_connection
|
||||||
@@ -179,6 +187,11 @@ class TestGetAccount(MockHttpTest):
|
|||||||
|
|
||||||
class TestHeadAccount(MockHttpTest):
|
class TestHeadAccount(MockHttpTest):
|
||||||
|
|
||||||
|
def test_ok(self):
|
||||||
|
c.http_connection = self.fake_http_connection(200)
|
||||||
|
value = c.head_account('http://www.tests.com', 'asdf')
|
||||||
|
self.assertEquals(value, (0, 0, 0))
|
||||||
|
|
||||||
def test_server_error(self):
|
def test_server_error(self):
|
||||||
c.http_connection = self.fake_http_connection(500)
|
c.http_connection = self.fake_http_connection(500)
|
||||||
self.assertRaises(c.ClientException, c.head_account,
|
self.assertRaises(c.ClientException, c.head_account,
|
||||||
@@ -274,5 +287,61 @@ class TestConnection(MockHttpTest):
|
|||||||
self.assertRaises(c.ClientException, conn.head_account)
|
self.assertRaises(c.ClientException, conn.head_account)
|
||||||
self.assertEquals(conn.attempts, conn.retries + 1)
|
self.assertEquals(conn.attempts, conn.retries + 1)
|
||||||
|
|
||||||
|
def test_resp_read_on_server_error(self):
|
||||||
|
c.http_connection = self.fake_http_connection(500)
|
||||||
|
conn = c.Connection('http://www.test.com', 'asdf', 'asdf', retries=0)
|
||||||
|
def get_auth(*args, **kwargs):
|
||||||
|
return 'http://www.new.com', 'new'
|
||||||
|
conn.get_auth = get_auth
|
||||||
|
self.url, self.token = conn.get_auth()
|
||||||
|
|
||||||
|
method_signatures = (
|
||||||
|
(conn.head_account, []),
|
||||||
|
(conn.get_account, []),
|
||||||
|
(conn.head_container, ('asdf',)),
|
||||||
|
(conn.get_container, ('asdf',)),
|
||||||
|
(conn.put_container, ('asdf',)),
|
||||||
|
(conn.delete_container, ('asdf',)),
|
||||||
|
(conn.head_object, ('asdf', 'asdf')),
|
||||||
|
(conn.get_object, ('asdf', 'asdf')),
|
||||||
|
(conn.put_object, ('asdf', 'asdf', 'asdf')),
|
||||||
|
(conn.post_object, ('asdf', 'asdf', {})),
|
||||||
|
(conn.delete_object, ('asdf', 'asdf')),
|
||||||
|
)
|
||||||
|
|
||||||
|
for method, args in method_signatures:
|
||||||
|
self.assertRaises(c.ClientException, method, *args)
|
||||||
|
try:
|
||||||
|
self.assertTrue(conn.http_conn[1].has_been_read)
|
||||||
|
except AssertionError:
|
||||||
|
self.fail('%s did not read the resp on server error' % method.__name__)
|
||||||
|
|
||||||
|
def test_reauth(self):
|
||||||
|
c.http_connection = self.fake_http_connection(401)
|
||||||
|
def get_auth(*args, **kwargs):
|
||||||
|
return 'http://www.new.com', 'new'
|
||||||
|
def swap_sleep(*args):
|
||||||
|
self.swap_sleep_called = True
|
||||||
|
c.get_auth = get_auth
|
||||||
|
c.http_connection = self.fake_http_connection(200)
|
||||||
|
c.sleep = swap_sleep
|
||||||
|
self.swap_sleep_called = False
|
||||||
|
|
||||||
|
conn = c.Connection('http://www.test.com', 'asdf', 'asdf',
|
||||||
|
preauthurl = 'http://www.old.com',
|
||||||
|
preauthtoken = 'old'
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEquals(conn.attempts, 0)
|
||||||
|
self.assertEquals(conn.url, 'http://www.old.com')
|
||||||
|
self.assertEquals(conn.token, 'old')
|
||||||
|
|
||||||
|
value = conn.head_account()
|
||||||
|
|
||||||
|
self.assertTrue(self.swap_sleep_called)
|
||||||
|
self.assertEquals(conn.attempts, 2)
|
||||||
|
self.assertEquals(conn.url, 'http://www.new.com')
|
||||||
|
self.assertEquals(conn.token, 'new')
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|||||||
Reference in New Issue
Block a user