diff --git a/.changes/next-release/bugfix-parser-5e14f8ef.json b/.changes/next-release/bugfix-parser-5e14f8ef.json new file mode 100644 index 0000000000..9075683a68 --- /dev/null +++ b/.changes/next-release/bugfix-parser-5e14f8ef.json @@ -0,0 +1,5 @@ +{ + "type": "bugfix", + "category": "parser", + "description": "Now we can disable inserting empty array in xml parser if the member doesn't exist in response." +} \ No newline at end of file diff --git a/apis/metadata.json b/apis/metadata.json index 0976569af9..1efe491e6f 100644 --- a/apis/metadata.json +++ b/apis/metadata.json @@ -360,7 +360,8 @@ }, "s3control": { "name": "S3Control", - "dualstackAvailable": true + "dualstackAvailable": true, + "xmlNoDefaultLists": true }, "servicecatalog": { "name": "ServiceCatalog", diff --git a/lib/model/api.js b/lib/model/api.js index 822aacd9f7..621750c222 100644 --- a/lib/model/api.js +++ b/lib/model/api.js @@ -3,6 +3,7 @@ var Operation = require('./operation'); var Shape = require('./shape'); var Paginator = require('./paginator'); var ResourceWaiter = require('./resource_waiter'); +var metadata = require('../../apis/metadata.json'); var util = require('../util'); var property = util.property; @@ -16,6 +17,9 @@ function Api(api, options) { api.metadata = api.metadata || {}; + var serviceIdentifier = options.serviceIdentifier; + delete options.serviceIdentifier; + property(this, 'isApi', true, false); property(this, 'apiVersion', api.metadata.apiVersion); property(this, 'endpointPrefix', api.metadata.endpointPrefix); @@ -30,6 +34,9 @@ function Api(api, options) { property(this, 'abbreviation', api.metadata.serviceAbbreviation); property(this, 'fullName', api.metadata.serviceFullName); property(this, 'serviceId', api.metadata.serviceId); + if (serviceIdentifier) { + property(this, 'xmlNoDefaultLists', metadata[serviceIdentifier].xmlNoDefaultLists, false); + } memoizedProperty(this, 'className', function() { var name = api.metadata.serviceAbbreviation || api.metadata.serviceFullName; diff --git a/lib/service.js b/lib/service.js index 538c627e40..ac6ad7f2e1 100644 --- a/lib/service.js +++ b/lib/service.js @@ -751,7 +751,9 @@ AWS.util.update(AWS.Service, { if (api.isApi) { svc.prototype.api = api; } else { - svc.prototype.api = new Api(api); + svc.prototype.api = new Api(api, { + serviceIdentifier: superclass.serviceIdentifier + }); } } diff --git a/lib/xml/browser_parser.js b/lib/xml/browser_parser.js index 32740d0f34..443e8b0e2a 100644 --- a/lib/xml/browser_parser.js +++ b/lib/xml/browser_parser.js @@ -108,7 +108,10 @@ function parseStructure(xml, shape) { getElementByTagName(xml, memberShape.name); if (xmlChild) { data[memberName] = parseXml(xmlChild, memberShape); - } else if (!memberShape.flattened && memberShape.type === 'list') { + } else if ( + !memberShape.flattened && + memberShape.type === 'list' && + !shape.api.xmlNoDefaultLists) { data[memberName] = memberShape.defaultValue; } } diff --git a/lib/xml/node_parser.js b/lib/xml/node_parser.js index 5b0d03ad11..9a2a701936 100644 --- a/lib/xml/node_parser.js +++ b/lib/xml/node_parser.js @@ -70,7 +70,7 @@ function parseStructure(xml, shape) { } else if (memberShape.isXmlAttribute && xml.$ && Object.prototype.hasOwnProperty.call(xml.$, xmlName)) { data[memberName] = parseScalar(xml.$[xmlName], memberShape); - } else if (memberShape.type === 'list') { + } else if (memberShape.type === 'list' && !shape.api.xmlNoDefaultLists) { data[memberName] = memberShape.defaultValue; } }); diff --git a/test/xml/parser.spec.js b/test/xml/parser.spec.js index c07865f19d..6527b6fd53 100644 --- a/test/xml/parser.spec.js +++ b/test/xml/parser.spec.js @@ -213,6 +213,28 @@ }); }); }); + it('return empty string for missing list when xmlNoDefaultLists is set', function() { + xml = ''; + rules = { + type: 'structure', + members: { + items: { + type: 'list', + member: { + type: 'string' + } + } + } + }; + var shape = AWS.Model.Shape.create(rules, { + api: { + protocol: 'rest-xml', + xmlNoDefaultLists: true + } + }); + var data = new AWS.XML.Parser().parse(xml, shape); + expect(data).to.eql({}); + }); it('Converts xml lists of strings into arrays of strings', function() { var rules, xml; xml = '\n \n abc\n xyz\n \n';