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(),