diff options
author | Burt Holzman <burt@fnal.gov> | 2013-01-24 00:24:09 -0600 |
---|---|---|
committer | Burt Holzman <burt@fnal.gov> | 2013-01-24 17:11:10 -0600 |
commit | dfec46ac8e4cba23da842698c2bc746c03994afe (patch) | |
tree | 96209b11f99fd93835f6952d8aae40b6ee081eaa | |
parent | 33680e6b2d2026ae8394579586f02d9773649674 (diff) | |
download | nova-dfec46ac8e4cba23da842698c2bc746c03994afe.tar.gz nova-dfec46ac8e4cba23da842698c2bc746c03994afe.tar.xz nova-dfec46ac8e4cba23da842698c2bc746c03994afe.zip |
Increase maximum URI size for EC2 API to 16k
The EC2 API supports both HTTP GET and POST agnostically. It also supports
user-data of 16k -- meaning that client tools could generate 16k URIs.
The WSGI default limit is 8k; this raises it.
Fixes bug 1098646.
Change-Id: Idec460d88b2affab970c9d9f39fa61295db035c5
-rwxr-xr-x | bin/nova-api | 6 | ||||
-rwxr-xr-x | bin/nova-api-ec2 | 2 | ||||
-rw-r--r-- | nova/service.py | 5 | ||||
-rw-r--r-- | nova/tests/test_wsgi.py | 21 | ||||
-rw-r--r-- | nova/wsgi.py | 25 |
5 files changed, 47 insertions, 12 deletions
diff --git a/bin/nova-api b/bin/nova-api index 16cf33cc5..d957f3e58 100755 --- a/bin/nova-api +++ b/bin/nova-api @@ -54,6 +54,10 @@ if __name__ == '__main__': launcher = service.ProcessLauncher() for api in CONF.enabled_apis: should_use_ssl = api in CONF.enabled_ssl_apis - server = service.WSGIService(api, use_ssl=should_use_ssl) + if api == 'ec2': + server = service.WSGIService(api, use_ssl=should_use_ssl, + max_url_len=16384) + else: + server = service.WSGIService(api, use_ssl=should_use_ssl) launcher.launch_server(server, workers=server.workers or 1) launcher.wait() diff --git a/bin/nova-api-ec2 b/bin/nova-api-ec2 index c7b08845d..d1b3d45ea 100755 --- a/bin/nova-api-ec2 +++ b/bin/nova-api-ec2 @@ -41,6 +41,6 @@ if __name__ == '__main__': config.parse_args(sys.argv) logging.setup("nova") utils.monkey_patch() - server = service.WSGIService('ec2') + server = service.WSGIService('ec2', max_url_len=16384) service.serve(server, workers=server.workers) service.wait() diff --git a/nova/service.py b/nova/service.py index 87857f93d..c250673f4 100644 --- a/nova/service.py +++ b/nova/service.py @@ -574,7 +574,7 @@ class Service(object): class WSGIService(object): """Provides ability to launch API from a 'paste' configuration.""" - def __init__(self, name, loader=None, use_ssl=False): + def __init__(self, name, loader=None, use_ssl=False, max_url_len=None): """Initialize, but do not start the WSGI server. :param name: The name of the WSGI server given to the loader. @@ -594,7 +594,8 @@ class WSGIService(object): self.app, host=self.host, port=self.port, - use_ssl=self.use_ssl) + use_ssl=self.use_ssl, + max_url_len=max_url_len) # Pull back actual port used self.port = self.server.port self.backdoor_port = None diff --git a/nova/tests/test_wsgi.py b/nova/tests/test_wsgi.py index b04bc3e03..cd64688a2 100644 --- a/nova/tests/test_wsgi.py +++ b/nova/tests/test_wsgi.py @@ -22,6 +22,8 @@ import os.path import tempfile import eventlet +import httplib2 +import paste import nova.exception from nova import test @@ -108,6 +110,25 @@ class TestWSGIServer(test.TestCase): server.stop() server.wait() + def test_uri_length_limit(self): + server = nova.wsgi.Server("test_uri_length_limit", None, + host="127.0.0.1", max_url_len=16384) + server.start() + + uri = "http://127.0.0.1:%d/%s" % (server.port, 10000 * 'x') + resp, _ = httplib2.Http().request(uri) + eventlet.sleep(0) + self.assertNotEqual(resp.status, + paste.httpexceptions.HTTPRequestURITooLong.code) + + uri = "http://127.0.0.1:%d/%s" % (server.port, 20000 * 'x') + resp, _ = httplib2.Http().request(uri) + eventlet.sleep(0) + self.assertEqual(resp.status, + paste.httpexceptions.HTTPRequestURITooLong.code) + server.stop() + server.wait() + class TestWSGIServerWithSSL(test.TestCase): """WSGI server with SSL tests.""" diff --git a/nova/wsgi.py b/nova/wsgi.py index 0a7570b6c..651dbc4f6 100644 --- a/nova/wsgi.py +++ b/nova/wsgi.py @@ -75,7 +75,7 @@ class Server(object): def __init__(self, name, app, host='0.0.0.0', port=0, pool_size=None, protocol=eventlet.wsgi.HttpProtocol, backlog=128, - use_ssl=False): + use_ssl=False, max_url_len=None): """Initialize, but do not start, a WSGI server. :param name: Pretty name for logging. @@ -84,6 +84,7 @@ class Server(object): :param port: Port number to server the application. :param pool_size: Maximum number of eventlets to spawn concurrently. :param backlog: Maximum number of queued connections. + :param max_url_len: Maximum length of permitted URLs. :returns: None :raises: nova.exception.InvalidInput """ @@ -95,6 +96,7 @@ class Server(object): self._logger = logging.getLogger("nova.%s.wsgi.server" % self.name) self._wsgi_logger = logging.WritableLogger(self._logger) self._use_ssl = use_ssl + self._max_url_len = max_url_len if backlog < 1: raise exception.InvalidInput( @@ -177,13 +179,20 @@ class Server(object): ":%(port)s with SSL support") % self.__dict__) raise - self._server = eventlet.spawn(eventlet.wsgi.server, - self._socket, - self.app, - protocol=self._protocol, - custom_pool=self._pool, - log=self._wsgi_logger, - log_format=CONF.wsgi_log_format) + wsgi_kwargs = { + 'func': eventlet.wsgi.server, + 'sock': self._socket, + 'site': self.app, + 'protocol': self._protocol, + 'custom_pool': self._pool, + 'log': self._wsgi_logger, + 'log_format': CONF.wsgi_log_format + } + + if self._max_url_len: + wsgi_kwargs['url_length_limit'] = self._max_url_len + + self._server = eventlet.spawn(**wsgi_kwargs) def stop(self): """Stop this server. |