summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Meade <alex.meade@rackspace.com>2011-06-14 10:16:51 -0400
committerAlex Meade <alex.meade@rackspace.com>2011-06-14 10:16:51 -0400
commita3ddb45464204464c93b1deb692414c44ce99376 (patch)
tree6d3b802299d861e9378f5122b40539ddd4d4fba8
parent035e43fbcc39d5664592873629f0689309c102cf (diff)
Created new exception for handling malformed requests
Wrote tests Raise httpBadRequest on malformed request bodies
-rw-r--r--nova/api/openstack/wsgi.py16
-rw-r--r--nova/exception.py4
-rw-r--r--nova/tests/api/openstack/test_api.py21
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