Support providing an XML namespace on the XML output from the OpenStack API
This commit is contained in:
		
							
								
								
									
										28
									
								
								nova/wsgi.py
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								nova/wsgi.py
									
									
									
									
									
								
							| @@ -355,24 +355,25 @@ class Controller(object): | ||||
|  | ||||
|         if type(result) is dict: | ||||
|             content_type = req.best_match_content_type() | ||||
|             body = self._serialize(result, content_type) | ||||
|             default_xmlns = self.get_default_xmlns(req) | ||||
|             body = self._serialize(result, content_type, default_xmlns) | ||||
|  | ||||
|             response = webob.Response() | ||||
|             response.headers["Content-Type"] = content_type | ||||
|             response.body = body | ||||
|             return response | ||||
|  | ||||
|         else: | ||||
|             return result | ||||
|  | ||||
|     def _serialize(self, data, content_type): | ||||
|     def _serialize(self, data, content_type, default_xmlns): | ||||
|         """ | ||||
|         Serialize the given dict to the provided content_type. | ||||
|         Uses self._serialization_metadata if it exists, which is a dict mapping | ||||
|         MIME types to information needed to serialize to that type. | ||||
|         """ | ||||
|         _metadata = getattr(type(self), "_serialization_metadata", {}) | ||||
|         serializer = Serializer(_metadata) | ||||
|  | ||||
|         serializer = Serializer(_metadata, default_xmlns) | ||||
|         try: | ||||
|             return serializer.serialize(data, content_type) | ||||
|         except exception.InvalidContentType: | ||||
| @@ -388,19 +389,24 @@ class Controller(object): | ||||
|         serializer = Serializer(_metadata) | ||||
|         return serializer.deserialize(data, content_type) | ||||
|  | ||||
|     def get_default_xmlns(self, req): | ||||
|         """Provide the XML namespace to use if none is otherwise specified.""" | ||||
|         return None | ||||
|  | ||||
|  | ||||
| class Serializer(object): | ||||
|     """ | ||||
|     Serializes and deserializes dictionaries to certain MIME types. | ||||
|     """ | ||||
|  | ||||
|     def __init__(self, metadata=None): | ||||
|     def __init__(self, metadata=None, default_xmlns=None): | ||||
|         """ | ||||
|         Create a serializer based on the given WSGI environment. | ||||
|         'metadata' is an optional dict mapping MIME types to information | ||||
|         needed to serialize a dictionary to that type. | ||||
|         """ | ||||
|         self.metadata = metadata or {} | ||||
|         self.default_xmlns = default_xmlns | ||||
|  | ||||
|     def _get_serialize_handler(self, content_type): | ||||
|         handlers = { | ||||
| @@ -478,11 +484,23 @@ class Serializer(object): | ||||
|         root_key = data.keys()[0] | ||||
|         doc = minidom.Document() | ||||
|         node = self._to_xml_node(doc, metadata, root_key, data[root_key]) | ||||
|  | ||||
|         xmlns = node.getAttribute('xmlns') | ||||
|         if not xmlns and self.default_xmlns: | ||||
|             node.setAttribute('xmlns', self.default_xmlns) | ||||
|  | ||||
|         return node.toprettyxml(indent='    ') | ||||
|  | ||||
|     def _to_xml_node(self, doc, metadata, nodename, data): | ||||
|         """Recursive method to convert data members to XML nodes.""" | ||||
|         result = doc.createElement(nodename) | ||||
|  | ||||
|         # Set the xml namespace if one is specified | ||||
|         # TODO(justinsb): We could also use prefixes on the keys | ||||
|         xmlns = metadata.get('xmlns', None) | ||||
|         if xmlns: | ||||
|             result.setAttribute('xmlns', xmlns) | ||||
|  | ||||
|         if type(data) is list: | ||||
|             singular = metadata.get('plurals', {}).get(nodename, None) | ||||
|             if singular is None: | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Justin Santa Barbara
					Justin Santa Barbara