summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEldar Nugaev <enugaev@griddynamics.com>2011-04-20 20:37:51 +0400
committerEldar Nugaev <enugaev@griddynamics.com>2011-04-20 20:37:51 +0400
commit48936f6b8f063cf71fa42b4586d8ba524ed39cc4 (patch)
tree63ed80b37d92cfe618c77b93edb5aff4e0a544a5
parent1a814ba56a696ce796ab7707eacc2ee065c448e8 (diff)
downloadnova-48936f6b8f063cf71fa42b4586d8ba524ed39cc4.tar.gz
nova-48936f6b8f063cf71fa42b4586d8ba524ed39cc4.tar.xz
nova-48936f6b8f063cf71fa42b4586d8ba524ed39cc4.zip
fix Request.get_content_type
-rw-r--r--nova/api/openstack/servers.py67
-rw-r--r--nova/tests/api/openstack/test_extensions.py1
-rw-r--r--nova/tests/api/openstack/test_servers.py4
-rw-r--r--nova/tests/api/test_wsgi.py7
-rw-r--r--nova/wsgi.py20
5 files changed, 52 insertions, 47 deletions
diff --git a/nova/api/openstack/servers.py b/nova/api/openstack/servers.py
index 22a9c632c..e0681e597 100644
--- a/nova/api/openstack/servers.py
+++ b/nova/api/openstack/servers.py
@@ -294,61 +294,47 @@ class Controller(common.OpenstackController):
'revertResize': self._action_revert_resize,
'rebuild': self._action_rebuild,
}
-
input_dict = self._deserialize(req.body, req.get_content_type())
for key in actions.keys():
if key in input_dict:
- return actions[key](input_dict, req, id)
+ try:
+ context = req.environ['nova.context']
+ return actions[key](context, input_dict, id)
+ except Exception, e:
+ LOG.exception(_("Error in action %(key)s: %(e)s") %
+ locals())
+ return faults.Fault(exc.HTTPBadRequest())
return faults.Fault(exc.HTTPNotImplemented())
- def _action_change_password(self, input_dict, req, id):
+ def _action_change_password(self, context, input_dict, id):
return exc.HTTPNotImplemented()
- def _action_confirm_resize(self, input_dict, req, id):
- try:
- self.compute_api.confirm_resize(req.environ['nova.context'], id)
- except Exception, e:
- LOG.exception(_("Error in confirm-resize %s"), e)
- return faults.Fault(exc.HTTPBadRequest())
+ def _action_confirm_resize(self, context, input_dict, id):
+ self.compute_api.confirm_resize(context, id)
return exc.HTTPNoContent()
- def _action_revert_resize(self, input_dict, req, id):
- try:
- self.compute_api.revert_resize(req.environ['nova.context'], id)
- except Exception, e:
- LOG.exception(_("Error in revert-resize %s"), e)
- return faults.Fault(exc.HTTPBadRequest())
+ def _action_revert_resize(self, context, input_dict, id):
+ self.compute_api.revert_resize(context, id)
return exc.HTTPAccepted()
- def _action_rebuild(self, input_dict, req, id):
+ def _action_rebuild(self, context, input_dict, id):
return faults.Fault(exc.HTTPNotImplemented())
- def _action_resize(self, input_dict, req, id):
+ def _action_resize(self, context, input_dict, id):
""" Resizes a given instance to the flavor size requested """
- try:
- if 'resize' in input_dict and 'flavorId' in input_dict['resize']:
- flavor_id = input_dict['resize']['flavorId']
- self.compute_api.resize(req.environ['nova.context'], id,
- flavor_id)
- else:
- LOG.exception(_("Missing arguments for resize"))
- return faults.Fault(exc.HTTPUnprocessableEntity())
- except Exception, e:
- LOG.exception(_("Error in resize %s"), e)
- return faults.Fault(exc.HTTPBadRequest())
+ if 'resize' in input_dict and 'flavorId' in input_dict['resize']:
+ flavor_id = input_dict['resize']['flavorId']
+ self.compute_api.resize(context, id, flavor_id)
+ else:
+ LOG.exception(_("Missing arguments for resize"))
+ return faults.Fault(exc.HTTPUnprocessableEntity())
return faults.Fault(exc.HTTPAccepted())
- def _action_reboot(self, input_dict, req, id):
- try:
- reboot_type = input_dict['reboot']['type']
- except Exception:
- raise faults.Fault(exc.HTTPNotImplemented())
- try:
- # TODO(gundlach): pass reboot_type, support soft reboot in
- # virt driver
- self.compute_api.reboot(req.environ['nova.context'], id)
- except:
- return faults.Fault(exc.HTTPUnprocessableEntity())
+ def _action_reboot(self, context, input_dict, id):
+ reboot_type = input_dict['reboot']['type']
+ # TODO(gundlach): pass reboot_type, support soft reboot in
+ # virt driver
+ self.compute_api.reboot(context, id)
return exc.HTTPAccepted()
@scheduler_api.redirect_handler
@@ -632,8 +618,7 @@ class ControllerV11(Controller):
def _get_addresses_view_builder(self, req):
return nova.api.openstack.views.addresses.ViewBuilderV11(req)
- def _action_change_password(self, input_dict, req, id):
- context = req.environ['nova.context']
+ def _action_change_password(self, context, input_dict, id):
if (not 'changePassword' in input_dict
or not 'adminPass' in input_dict['changePassword']):
msg = _("No adminPass was specified")
diff --git a/nova/tests/api/openstack/test_extensions.py b/nova/tests/api/openstack/test_extensions.py
index 481d34ed1..6453e96c9 100644
--- a/nova/tests/api/openstack/test_extensions.py
+++ b/nova/tests/api/openstack/test_extensions.py
@@ -158,6 +158,7 @@ class ActionExtensionTest(unittest.TestCase):
request.method = 'POST'
request.content_type = 'application/json'
request.body = json.dumps(body)
+ request.environ = {'nova.context': 'context'}
response = request.get_response(ext_midware)
return response
diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py
index 556046e9d..a92da52b1 100644
--- a/nova/tests/api/openstack/test_servers.py
+++ b/nova/tests/api/openstack/test_servers.py
@@ -952,6 +952,7 @@ class ServersTest(test.TestCase):
req.method = 'POST'
req.content_type = 'application/json'
req.body = json.dumps(body)
+ req.environ = {"nova.context": "context"}
res = req.get_response(fakes.wsgi_app())
self.assertEqual(res.status_int, 501)
@@ -973,6 +974,7 @@ class ServersTest(test.TestCase):
req.method = 'POST'
req.content_type = 'application/json'
req.body = json.dumps(body)
+ req.environ = {"nova.context": "context"}
res = req.get_response(fakes.wsgi_app())
self.assertEqual(res.status_int, 202)
self.assertEqual(mock_method.instance_id, '1')
@@ -993,6 +995,7 @@ class ServersTest(test.TestCase):
req.method = 'POST'
req.content_type = 'application/json'
req.body = json.dumps(body)
+ req.environ = {"nova.context": "context"}
res = req.get_response(fakes.wsgi_app())
self.assertEqual(res.status_int, 400)
@@ -1002,6 +1005,7 @@ class ServersTest(test.TestCase):
req.method = 'POST'
req.content_type = 'application/json'
req.body = json.dumps(body)
+ req.environ = {"nova.context": "context"}
res = req.get_response(fakes.wsgi_app())
self.assertEqual(res.status_int, 400)
diff --git a/nova/tests/api/test_wsgi.py b/nova/tests/api/test_wsgi.py
index 1ecdd1cfb..ed96aac5e 100644
--- a/nova/tests/api/test_wsgi.py
+++ b/nova/tests/api/test_wsgi.py
@@ -136,6 +136,13 @@ class RequestTest(test.TestCase):
request.body = "asdf<br />"
self.assertRaises(webob.exc.HTTPBadRequest, request.get_content_type)
+ def test_request_content_type_with_charset(self):
+ request = wsgi.Request.blank('/tests/123')
+ request.headers["Content-Type"] = "application/json; charset=UTF-8"
+ request.body = "<body />"
+ result = request.get_content_type()
+ self.assertEqual(result, "application/json")
+
def test_content_type_from_accept_xml(self):
request = wsgi.Request.blank('/tests/123')
request.headers["Accept"] = "application/xml"
diff --git a/nova/wsgi.py b/nova/wsgi.py
index de2e0749f..617830c22 100644
--- a/nova/wsgi.py
+++ b/nova/wsgi.py
@@ -28,6 +28,7 @@ from xml.dom import minidom
import eventlet
import eventlet.wsgi
eventlet.patcher.monkey_patch(all=False, socket=True, time=True)
+import re
import routes
import routes.middleware
import webob
@@ -105,12 +106,19 @@ class Request(webob.Request):
return bm or "application/json"
def get_content_type(self):
- try:
- ct = self.headers["Content-Type"]
- assert ct in ("application/xml", "application/json")
- return ct
- except Exception:
- raise webob.exc.HTTPBadRequest("Invalid content type")
+ allowed_types = ("application/xml", "application/json")
+ if not "Content-Type" in self.headers:
+ msg = _("Missing Content-Type")
+ LOG.debug(msg)
+ raise webob.exc.HTTPBadRequest(msg)
+ content_type = self.headers["Content-Type"]
+ match = re.search("([\w/]+)", content_type)
+ if match:
+ type = match.group(0)
+ if type in allowed_types:
+ return type
+ LOG.debug(_("Wrong Content-Type: %s") % content_type)
+ raise webob.exc.HTTPBadRequest("Invalid content type")
class Application(object):