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>
This commit is contained in:
Steven Hardy 2012-06-21 10:52:25 +01:00
parent acf8334a1f
commit b2ab26398f
2 changed files with 17 additions and 7 deletions

View File

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

View File

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