diff --git a/neutronclient/client.py b/neutronclient/client.py index bc645f195..0ab732ec3 100644 --- a/neutronclient/client.py +++ b/neutronclient/client.py @@ -40,6 +40,7 @@ else: _requests_log_level = logging.WARNING logging.getLogger("requests").setLevel(_requests_log_level) +MAX_URI_LEN = 8192 class HTTPClient(object): @@ -146,9 +147,16 @@ class HTTPClient(object): return resp, resp.text + def _check_uri_length(self, action): + uri_len = len(self.endpoint_url) + len(action) + if uri_len > MAX_URI_LEN: + raise exceptions.RequestURITooLong( + excess=uri_len - 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 @@ -286,8 +294,15 @@ class SessionClient(adapter.Adapter): resp = super(SessionClient, self).request(*args, **kwargs) return resp, resp.text + def _check_uri_length(self, url): + uri_len = len(self.endpoint_url) + len(url) + if uri_len > MAX_URI_LEN: + raise exceptions.RequestURITooLong( + excess=uri_len - MAX_URI_LEN) + def do_request(self, url, method, **kwargs): kwargs.setdefault('authenticated', True) + self._check_uri_length(url) return self.request(url, method, **kwargs) @property diff --git a/neutronclient/tests/unit/test_cli20_network.py b/neutronclient/tests/unit/test_cli20_network.py index 31754be26..1ac49b637 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, + self.mox.StubOutWithMock(self.client.httpclient, "_check_uri_length") - self.client._check_uri_length(mox.IgnoreArg()).AndRaise( + self.client.httpclient._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._check_uri_length( + self.client.httpclient._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 8032e0390..ec18fb8ee 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, + self.mox.StubOutWithMock(self.client.httpclient, '_check_uri_length') - self.client._check_uri_length(mox.IgnoreArg()).AndRaise( + self.client.httpclient._check_uri_length(mox.IgnoreArg()).AndRaise( exceptions.RequestURITooLong(excess=1)) responses = self._build_test_data(data, excess=1) for item in responses: - self.client._check_uri_length( + self.client.httpclient._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 2e63bb2a2..0feac68e9 100644 --- a/neutronclient/v2_0/client.py +++ b/neutronclient/v2_0/client.py @@ -184,12 +184,6 @@ 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 @@ -198,8 +192,6 @@ 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) @@ -464,9 +456,6 @@ 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.