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)