diff --git a/neutronclient/client.py b/neutronclient/client.py index 0a68ff063..bc645f195 100644 --- a/neutronclient/client.py +++ b/neutronclient/client.py @@ -48,9 +48,6 @@ class HTTPClient(object): USER_AGENT = 'python-neutronclient' CONTENT_TYPE = 'application/json' - # 8192 Is the default max URI len for eventlet.wsgi.server - MAX_URI_LEN = 8192 - def __init__(self, username=None, user_id=None, tenant_name=None, tenant_id=None, password=None, auth_url=None, @@ -149,16 +146,9 @@ class HTTPClient(object): return resp, resp.text - def _check_uri_length(self, action): - uri_len = len(self.endpoint_url) + len(action) - if uri_len > self.MAX_URI_LEN: - raise exceptions.RequestURITooLong( - excess=uri_len - self.MAX_URI_LEN) - def do_request(self, url, method, **kwargs): # Ensure client always has correct uri - do not guesstimate anything self.authenticate_and_fetch_endpoint_url() - self._check_uri_length(url) # Perform the request once. If we get a 401 back then it # might be because the auth token expired, so try to diff --git a/neutronclient/tests/unit/test_cli20.py b/neutronclient/tests/unit/test_cli20.py index df92e4d15..657b15e47 100644 --- a/neutronclient/tests/unit/test_cli20.py +++ b/neutronclient/tests/unit/test_cli20.py @@ -622,6 +622,17 @@ class ClientV2TestJson(CLITestV20Base): self.mox.VerifyAll() self.mox.UnsetStubs() + def test_do_request_with_long_uri_exception(self): + long_string = 'x' * 8200 # 8200 > MAX_URI_LEN:8192 + params = {'id': long_string} + + try: + self.client.do_request('GET', '/test', body='', params=params) + except exceptions.RequestURITooLong as cm: + self.assertNotEqual(cm.excess, 0) + else: + self.fail('Expected exception NOT raised') + class ClientV2UnicodeTestXML(ClientV2TestJson): format = 'xml' diff --git a/neutronclient/tests/unit/test_cli20_network.py b/neutronclient/tests/unit/test_cli20_network.py index 1ac49b637..31754be26 100644 --- a/neutronclient/tests/unit/test_cli20_network.py +++ b/neutronclient/tests/unit/test_cli20_network.py @@ -551,14 +551,14 @@ class CLITestV20NetworkJSON(test_cli20.CLITestV20Base): filters, response = self._build_test_data(data) # 1 char of extra URI len will cause a split in 2 requests - self.mox.StubOutWithMock(self.client.httpclient, + self.mox.StubOutWithMock(self.client, "_check_uri_length") - self.client.httpclient._check_uri_length(mox.IgnoreArg()).AndRaise( + self.client._check_uri_length(mox.IgnoreArg()).AndRaise( exceptions.RequestURITooLong(excess=1)) for data in sub_data_lists: filters, response = self._build_test_data(data) - self.client.httpclient._check_uri_length( + self.client._check_uri_length( mox.IgnoreArg()).AndReturn(None) self.client.httpclient.request( test_cli20.MyUrlComparator( diff --git a/neutronclient/tests/unit/test_cli20_securitygroup.py b/neutronclient/tests/unit/test_cli20_securitygroup.py index ec18fb8ee..8032e0390 100644 --- a/neutronclient/tests/unit/test_cli20_securitygroup.py +++ b/neutronclient/tests/unit/test_cli20_securitygroup.py @@ -265,14 +265,14 @@ class CLITestV20SecurityGroupsJSON(test_cli20.CLITestV20Base): def test_extend_list_exceed_max_uri_len(self): def mox_calls(path, data): # 1 char of extra URI len will cause a split in 2 requests - self.mox.StubOutWithMock(self.client.httpclient, + self.mox.StubOutWithMock(self.client, '_check_uri_length') - self.client.httpclient._check_uri_length(mox.IgnoreArg()).AndRaise( + self.client._check_uri_length(mox.IgnoreArg()).AndRaise( exceptions.RequestURITooLong(excess=1)) responses = self._build_test_data(data, excess=1) for item in responses: - self.client.httpclient._check_uri_length( + self.client._check_uri_length( mox.IgnoreArg()).AndReturn(None) self.client.httpclient.request( test_cli20.end_url(path, item['filter']), diff --git a/neutronclient/v2_0/client.py b/neutronclient/v2_0/client.py index 0feac68e9..2e63bb2a2 100644 --- a/neutronclient/v2_0/client.py +++ b/neutronclient/v2_0/client.py @@ -184,6 +184,12 @@ class ClientBase(object): # Raise the appropriate exception exception_handler_v20(status_code, des_error_body) + def _check_uri_length(self, action): + uri_len = len(self.httpclient.endpoint_url) + len(action) + if uri_len > self.MAX_URI_LEN: + raise exceptions.RequestURITooLong( + excess=uri_len - self.MAX_URI_LEN) + def do_request(self, method, action, body=None, headers=None, params=None): # Add format and tenant_id action += ".%s" % self.format @@ -192,6 +198,8 @@ class ClientBase(object): params = utils.safe_encode_dict(params) action += '?' + urlparse.urlencode(params, doseq=1) + self._check_uri_length(action) + if body: body = self.serialize(body) @@ -456,6 +464,9 @@ class Client(ClientBase): 'healthmonitors': 'healthmonitor', } + # 8192 Is the default max URI len for eventlet.wsgi.server + MAX_URI_LEN = 8192 + @APIParamsCall def list_ext(self, path, **_params): """Client extension hook for lists.