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 <shardy@redhat.com>
Steven Hardy 10 years ago
parent acf8334a1f
commit b2ab26398f
  1. 3
  2. 21

@ -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)

@ -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
@ -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)
@ -507,7 +513,12 @@ class Resource(object):
request, **action_args)
response = webob.Response(request=request)
self.dispatch(self.serializer, action, response, action_result)
if content_type == "JSON":
action, response, action_result)
self.dispatch(XMLResponseSerializer(), action,
response, action_result)
return response
# return unserializable result (typically a webob exc)