From 50266eec2b86aaa0a7717adf004576d444f4fce9 Mon Sep 17 00:00:00 2001 From: Russell Bryant Date: Thu, 26 Sep 2013 11:43:29 -0400 Subject: [PATCH] Fix getting header in redirect processing The code for processing an HTTP redirect included an incorrect method of getting the Location header from an HTTPResponse. It needs to use the getheader() method on the response, instead. This patch fixes that and includes a unit test that covers this code path. Change-Id: I0952fabad581b020dee07bdc4007b55b47c906aa Closes-Bug: #1231524 --- glanceclient/common/http.py | 3 ++- tests/test_http.py | 24 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/glanceclient/common/http.py b/glanceclient/common/http.py index dfd746d..7c8c0f4 100644 --- a/glanceclient/common/http.py +++ b/glanceclient/common/http.py @@ -233,7 +233,8 @@ class HTTPClient(object): raise exc.from_response(resp, body_str) elif resp.status in (301, 302, 305): # Redirected. Reissue the request to the new location. - return self._http_request(resp['location'], method, **kwargs) + return self._http_request(resp.getheader('location', None), method, + **kwargs) elif resp.status == 300: raise exc.from_response(resp) diff --git a/tests/test_http.py b/tests/test_http.py index f25227a..8145546 100644 --- a/tests/test_http.py +++ b/tests/test_http.py @@ -100,6 +100,30 @@ class TestClient(testtools.TestCase): (comm_err.message, self.endpoint)) self.assertTrue(self.endpoint in comm_err.message, fail_msg) + def test_request_redirected(self): + resp = utils.FakeResponse({'location': 'http://www.example.com'}, + status=302, body=StringIO.StringIO()) + httplib.HTTPConnection.request( + mox.IgnoreArg(), + mox.IgnoreArg(), + headers=mox.IgnoreArg(), + ) + httplib.HTTPConnection.getresponse().AndReturn(resp) + + # The second request should be to the redirected location + expected_response = 'Ok' + resp2 = utils.FakeResponse({}, StringIO.StringIO(expected_response)) + httplib.HTTPConnection.request( + 'GET', + 'http://www.example.com', + headers=mox.IgnoreArg(), + ) + httplib.HTTPConnection.getresponse().AndReturn(resp2) + + self.mock.ReplayAll() + + self.client.json_request('GET', '/v1/images/detail') + def test_http_encoding(self): httplib.HTTPConnection.request( mox.IgnoreArg(),