Merge "Reinstate Max URI length checking to V2_0 Client"

This commit is contained in:
Jenkins
2015-03-11 06:24:32 +00:00
committed by Gerrit Code Review
5 changed files with 28 additions and 16 deletions

View File

@@ -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

View File

@@ -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'

View File

@@ -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(

View File

@@ -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']),

View File

@@ -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.