diff options
| author | Alex Meade <alex.meade@rackspace.com> | 2011-06-14 10:16:51 -0400 |
|---|---|---|
| committer | Alex Meade <alex.meade@rackspace.com> | 2011-06-14 10:16:51 -0400 |
| commit | a3ddb45464204464c93b1deb692414c44ce99376 (patch) | |
| tree | 6d3b802299d861e9378f5122b40539ddd4d4fba8 | |
| parent | 035e43fbcc39d5664592873629f0689309c102cf (diff) | |
Created new exception for handling malformed requests
Wrote tests
Raise httpBadRequest on malformed request bodies
| -rw-r--r-- | nova/api/openstack/wsgi.py | 16 | ||||
| -rw-r--r-- | nova/exception.py | 4 | ||||
| -rw-r--r-- | nova/tests/api/openstack/test_api.py | 21 |
3 files changed, 38 insertions, 3 deletions
diff --git a/nova/api/openstack/wsgi.py b/nova/api/openstack/wsgi.py index b0e2cab2c..7f17471c4 100644 --- a/nova/api/openstack/wsgi.py +++ b/nova/api/openstack/wsgi.py @@ -2,6 +2,7 @@ import json import webob from xml.dom import minidom +from xml.parsers.expat import ExpatError from nova import exception from nova import log as logging @@ -71,7 +72,10 @@ class TextDeserializer(object): class JSONDeserializer(TextDeserializer): def default(self, datastring): - return utils.loads(datastring) + try: + return utils.loads(datastring) + except ValueError: + raise exception.MalformedRequestBody() class XMLDeserializer(TextDeserializer): @@ -86,8 +90,12 @@ class XMLDeserializer(TextDeserializer): def default(self, datastring): plurals = set(self.metadata.get('plurals', {})) - node = minidom.parseString(datastring).childNodes[0] - return {node.nodeName: self._from_xml_node(node, plurals)} + + try: + node = minidom.parseString(datastring).childNodes[0] + return {node.nodeName: self._from_xml_node(node, plurals)} + except ExpatError: + raise exception.MalformedRequestBody() def _from_xml_node(self, node, listnames): """Convert a minidom node to a simple Python type. @@ -353,6 +361,8 @@ class Resource(wsgi.Application): request) except exception.InvalidContentType: return webob.exc.HTTPBadRequest(_("Unsupported Content-Type")) + except exception.MalformedRequestBody: + return webob.exc.HTTPBadRequest(_("Malformed request")) action_result = self.dispatch(request, action, action_args) diff --git a/nova/exception.py b/nova/exception.py index 1571dd032..ffd88fbe7 100644 --- a/nova/exception.py +++ b/nova/exception.py @@ -585,3 +585,7 @@ class InstanceExists(Duplicate): class MigrationError(NovaException): message = _("Migration error") + ": %(reason)s" + + +class MalformedRequestBody(NovaException): + message = _("Malformed message body") + ": %(reason)s" diff --git a/nova/tests/api/openstack/test_api.py b/nova/tests/api/openstack/test_api.py index c63431a45..7321c329f 100644 --- a/nova/tests/api/openstack/test_api.py +++ b/nova/tests/api/openstack/test_api.py @@ -15,6 +15,8 @@ # License for the specific language governing permissions and limitations # under the License. +import json + import webob.exc import webob.dec @@ -23,6 +25,7 @@ from webob import Request from nova import test from nova.api import openstack from nova.api.openstack import faults +from nova.tests.api.openstack import fakes class APITest(test.TestCase): @@ -31,6 +34,24 @@ class APITest(test.TestCase): # simpler version of the app than fakes.wsgi_app return openstack.FaultWrapper(inner_app) + def test_malformed_json(self): + req = webob.Request.blank('/') + req.method = 'POST' + req.body = '{' + req.headers["content-type"] = "application/json" + + res = req.get_response(fakes.wsgi_app()) + self.assertEqual(res.status_int, 400) + + def test_malformed_xml(self): + req = webob.Request.blank('/') + req.method = 'POST' + req.body = '<hi im not xml>' + req.headers["content-type"] = "application/xml" + + res = req.get_response(fakes.wsgi_app()) + self.assertEqual(res.status_int, 400) + def test_exceptions_are_converted_to_faults(self): @webob.dec.wsgify |
