diff options
| author | Dolph Mathews <dolph.mathews@gmail.com> | 2012-02-10 14:52:13 -0600 |
|---|---|---|
| committer | Dolph Mathews <dolph.mathews@gmail.com> | 2012-02-27 09:58:04 -0600 |
| commit | 212489084fac8de20718bfccad2f77cbfa7ea3e2 (patch) | |
| tree | 4cfada718772bb13e93be1f6c8f3b932064eb7ab /keystone/middleware | |
| parent | e23ecc6893db337671f75b6cc069d96a183940e8 (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.py | 31 |
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) |
