]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
heat API : Add support for ContentType=JSON query parameter
authorSteven Hardy <shardy@redhat.com>
Thu, 21 Jun 2012 09:52:25 +0000 (10:52 +0100)
committerSteven Hardy <shardy@redhat.com>
Thu, 21 Jun 2012 19:45:30 +0000 (20:45 +0100)
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>
heat/api/v1/stacks.py
heat/common/wsgi.py

index 18deaee53471e46d769d0f9fec16d074b032e54d..9f5283160442e234aacf5eb59d760057a29437c9 100644 (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)
index e6d6f5bc35b85e6a6e4c4d8cc14130a1999e86da..dd92718a4b3f7f2db39301f575f6929dcc3faf08 100644 (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)