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:
parent
acf8334a1f
commit
b2ab26398f
|
@ -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
|
||||
|
||||
@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)
|
||||
|
|
Loading…
Reference in New Issue