summaryrefslogtreecommitdiffstats
path: root/keystone/middleware
diff options
context:
space:
mode:
authorDolph Mathews <dolph.mathews@gmail.com>2012-02-10 14:52:13 -0600
committerDolph Mathews <dolph.mathews@gmail.com>2012-02-27 09:58:04 -0600
commit212489084fac8de20718bfccad2f77cbfa7ea3e2 (patch)
tree4cfada718772bb13e93be1f6c8f3b932064eb7ab /keystone/middleware
parente23ecc6893db337671f75b6cc069d96a183940e8 (diff)
XML de/serialization (bug 928058)
Middleware rewrites incoming XML requests as JSON, and outgoing JSON as XML, per Accept and Content-Type headers. Tests assert that core API methods support WADL/XSD specs, and cover JSON content as well. Change-Id: I6897971dd745766cbc472fd6e5346b1b34d933b0
Diffstat (limited to 'keystone/middleware')
-rw-r--r--keystone/middleware/core.py31
1 files changed, 30 insertions, 1 deletions
diff --git a/keystone/middleware/core.py b/keystone/middleware/core.py
index f5ef7794..19212e0c 100644
--- a/keystone/middleware/core.py
+++ b/keystone/middleware/core.py
@@ -19,6 +19,8 @@ import json
import webob.exc
from keystone import config
+from keystone import exception
+from keystone.common import serializer
from keystone.common import wsgi
@@ -109,7 +111,7 @@ class JsonBodyMiddleware(wsgi.Middleware):
try:
params_parsed = json.loads(params_json)
except ValueError:
- msg = "Malformed json in request body"
+ msg = 'Malformed json in request body'
raise webob.exc.HTTPBadRequest(explanation=msg)
finally:
if not params_parsed:
@@ -124,3 +126,30 @@ class JsonBodyMiddleware(wsgi.Middleware):
params[k] = v
request.environ[PARAMS_ENV] = params
+
+
+class XmlBodyMiddleware(wsgi.Middleware):
+ """De/serializes XML to/from JSON."""
+ @webob.dec.wsgify(RequestClass=wsgi.Request)
+ def __call__(self, request):
+ self.process_request(request)
+ response = request.get_response(self.application)
+ self.process_response(request, response)
+ return response
+
+ def process_request(self, request):
+ """Transform the request from XML to JSON."""
+ incoming_xml = 'application/xml' in str(request.content_type)
+ if incoming_xml and request.body:
+ request.content_type = 'application/json'
+ request.body = json.dumps(serializer.from_xml(request.body))
+
+ def process_response(self, request, response):
+ """Transform the response from JSON to XML."""
+ outgoing_xml = 'application/xml' in str(request.accept)
+ if outgoing_xml and response.body:
+ response.content_type = 'application/xml'
+ try:
+ response.body = serializer.to_xml(json.loads(response.body))
+ except:
+ raise exception.Error(message=response.body)