From b2ab26398ffa1232e84cc0c78217cad644eaae30 Mon Sep 17 00:00:00 2001 From: Steven Hardy Date: Thu, 21 Jun 2012 10:52:25 +0100 Subject: [PATCH] heat API : Add support for ContentType=JSON query parameter From reading the boto code, and looking at real AWS API responses it would appear there is an (undocumented?) AWS query parameter which switches response format from XML (default) to JSON ref #125 Change-Id: I7c8b0f5701be5ff8bd0a3b135e42cf0e46e39ded Signed-off-by: Steven Hardy --- heat/api/v1/stacks.py | 3 +-- heat/common/wsgi.py | 21 ++++++++++++++++----- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/heat/api/v1/stacks.py b/heat/api/v1/stacks.py index 18deaee534..9f52831604 100644 --- a/heat/api/v1/stacks.py +++ b/heat/api/v1/stacks.py @@ -352,5 +352,4 @@ def create_resource(options): Stacks resource factory method. """ deserializer = wsgi.JSONRequestDeserializer() - serializer = wsgi.XMLResponseSerializer() - return wsgi.Resource(StackController(options), deserializer, serializer) + return wsgi.Resource(StackController(options), deserializer) diff --git a/heat/common/wsgi.py b/heat/common/wsgi.py index e6d6f5bc35..dd92718a4b 100644 --- a/heat/common/wsgi.py +++ b/heat/common/wsgi.py @@ -481,16 +481,13 @@ class Resource(object): may raise a webob.exc exception or return a dict, which will be serialized by requested content type. """ - def __init__(self, controller, deserializer, serializer): + def __init__(self, controller, deserializer): """ :param controller: object that implement methods created by routes lib :param deserializer: object that supports webob request deserialization through controller-like actions - :param serializer: object that supports webob response serialization - through controller-like actions """ self.controller = controller - self.serializer = serializer self.deserializer = deserializer @webob.dec.wsgify(RequestClass=Request) @@ -499,6 +496,15 @@ class Resource(object): action_args = self.get_action_args(request.environ) action = action_args.pop('action', None) + # From reading the boto code, and observation of real AWS api responses + # it seems that the AWS api ignores the content-type in the html header + # Instead it looks at a "ContentType" GET query parameter + # This doesn't seem to be documented in the AWS cfn API spec, but it + # would appear that the default response serialization is XML, as + # described in the API docs, but passing a query parameter of + # ContentType=JSON results in a JSON serialized response... + content_type = request.GET.get("ContentType") + deserialized_request = self.dispatch(self.deserializer, action, request) action_args.update(deserialized_request) @@ -507,7 +513,12 @@ class Resource(object): request, **action_args) try: response = webob.Response(request=request) - self.dispatch(self.serializer, action, response, action_result) + if content_type == "JSON": + self.dispatch(JSONResponseSerializer(), + action, response, action_result) + else: + self.dispatch(XMLResponseSerializer(), action, + response, action_result) return response # return unserializable result (typically a webob exc)