Merge "Reinstate Max URI length checking to V2_0 Client"
This commit is contained in:
@@ -48,9 +48,6 @@ class HTTPClient(object):
|
|||||||
USER_AGENT = 'python-neutronclient'
|
USER_AGENT = 'python-neutronclient'
|
||||||
CONTENT_TYPE = 'application/json'
|
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,
|
def __init__(self, username=None, user_id=None,
|
||||||
tenant_name=None, tenant_id=None,
|
tenant_name=None, tenant_id=None,
|
||||||
password=None, auth_url=None,
|
password=None, auth_url=None,
|
||||||
@@ -149,16 +146,9 @@ class HTTPClient(object):
|
|||||||
|
|
||||||
return resp, resp.text
|
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):
|
def do_request(self, url, method, **kwargs):
|
||||||
# Ensure client always has correct uri - do not guesstimate anything
|
# Ensure client always has correct uri - do not guesstimate anything
|
||||||
self.authenticate_and_fetch_endpoint_url()
|
self.authenticate_and_fetch_endpoint_url()
|
||||||
self._check_uri_length(url)
|
|
||||||
|
|
||||||
# Perform the request once. If we get a 401 back then it
|
# Perform the request once. If we get a 401 back then it
|
||||||
# might be because the auth token expired, so try to
|
# might be because the auth token expired, so try to
|
||||||
|
@@ -622,6 +622,17 @@ class ClientV2TestJson(CLITestV20Base):
|
|||||||
self.mox.VerifyAll()
|
self.mox.VerifyAll()
|
||||||
self.mox.UnsetStubs()
|
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):
|
class ClientV2UnicodeTestXML(ClientV2TestJson):
|
||||||
format = 'xml'
|
format = 'xml'
|
||||||
|
@@ -551,14 +551,14 @@ class CLITestV20NetworkJSON(test_cli20.CLITestV20Base):
|
|||||||
filters, response = self._build_test_data(data)
|
filters, response = self._build_test_data(data)
|
||||||
|
|
||||||
# 1 char of extra URI len will cause a split in 2 requests
|
# 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")
|
"_check_uri_length")
|
||||||
self.client.httpclient._check_uri_length(mox.IgnoreArg()).AndRaise(
|
self.client._check_uri_length(mox.IgnoreArg()).AndRaise(
|
||||||
exceptions.RequestURITooLong(excess=1))
|
exceptions.RequestURITooLong(excess=1))
|
||||||
|
|
||||||
for data in sub_data_lists:
|
for data in sub_data_lists:
|
||||||
filters, response = self._build_test_data(data)
|
filters, response = self._build_test_data(data)
|
||||||
self.client.httpclient._check_uri_length(
|
self.client._check_uri_length(
|
||||||
mox.IgnoreArg()).AndReturn(None)
|
mox.IgnoreArg()).AndReturn(None)
|
||||||
self.client.httpclient.request(
|
self.client.httpclient.request(
|
||||||
test_cli20.MyUrlComparator(
|
test_cli20.MyUrlComparator(
|
||||||
|
@@ -265,14 +265,14 @@ class CLITestV20SecurityGroupsJSON(test_cli20.CLITestV20Base):
|
|||||||
def test_extend_list_exceed_max_uri_len(self):
|
def test_extend_list_exceed_max_uri_len(self):
|
||||||
def mox_calls(path, data):
|
def mox_calls(path, data):
|
||||||
# 1 char of extra URI len will cause a split in 2 requests
|
# 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')
|
'_check_uri_length')
|
||||||
self.client.httpclient._check_uri_length(mox.IgnoreArg()).AndRaise(
|
self.client._check_uri_length(mox.IgnoreArg()).AndRaise(
|
||||||
exceptions.RequestURITooLong(excess=1))
|
exceptions.RequestURITooLong(excess=1))
|
||||||
responses = self._build_test_data(data, excess=1)
|
responses = self._build_test_data(data, excess=1)
|
||||||
|
|
||||||
for item in responses:
|
for item in responses:
|
||||||
self.client.httpclient._check_uri_length(
|
self.client._check_uri_length(
|
||||||
mox.IgnoreArg()).AndReturn(None)
|
mox.IgnoreArg()).AndReturn(None)
|
||||||
self.client.httpclient.request(
|
self.client.httpclient.request(
|
||||||
test_cli20.end_url(path, item['filter']),
|
test_cli20.end_url(path, item['filter']),
|
||||||
|
@@ -184,6 +184,12 @@ class ClientBase(object):
|
|||||||
# Raise the appropriate exception
|
# Raise the appropriate exception
|
||||||
exception_handler_v20(status_code, des_error_body)
|
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):
|
def do_request(self, method, action, body=None, headers=None, params=None):
|
||||||
# Add format and tenant_id
|
# Add format and tenant_id
|
||||||
action += ".%s" % self.format
|
action += ".%s" % self.format
|
||||||
@@ -192,6 +198,8 @@ class ClientBase(object):
|
|||||||
params = utils.safe_encode_dict(params)
|
params = utils.safe_encode_dict(params)
|
||||||
action += '?' + urlparse.urlencode(params, doseq=1)
|
action += '?' + urlparse.urlencode(params, doseq=1)
|
||||||
|
|
||||||
|
self._check_uri_length(action)
|
||||||
|
|
||||||
if body:
|
if body:
|
||||||
body = self.serialize(body)
|
body = self.serialize(body)
|
||||||
|
|
||||||
@@ -456,6 +464,9 @@ class Client(ClientBase):
|
|||||||
'healthmonitors': 'healthmonitor',
|
'healthmonitors': 'healthmonitor',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# 8192 Is the default max URI len for eventlet.wsgi.server
|
||||||
|
MAX_URI_LEN = 8192
|
||||||
|
|
||||||
@APIParamsCall
|
@APIParamsCall
|
||||||
def list_ext(self, path, **_params):
|
def list_ext(self, path, **_params):
|
||||||
"""Client extension hook for lists.
|
"""Client extension hook for lists.
|
||||||
|
Reference in New Issue
Block a user