Skip to content

Commit a3d2c0a

Browse files
authored
fix(xml-body-parser): handle parsing flattened list (#217)
1 parent 0556c99 commit a3d2c0a

File tree

2 files changed

+44
-9
lines changed

2 files changed

+44
-9
lines changed

packages/xml-body-parser/src/index.spec.ts

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,18 @@ describe('XmlBodyParser', () => {
66
const rules: Member = {
77
resultWrapper: 'OperationResult',
88
shape: {
9-
type: 'string'
9+
type: 'structure',
10+
required: [],
11+
members: {
12+
Str: {shape: {type: 'string'}}
13+
}
1014
}
1115
}
1216
const parser = new XmlBodyParser(jest.fn());
1317
it('should wrap the shap with a structure with wrapper name as member name', () => {
14-
let xml = '<xml><OperationResult>foo</OperationResult></xml>';
18+
let xml = '<xml><OperationResult><Str>foo</Str></OperationResult></xml>';
1519
expect(parser.parse(rules, xml)).toEqual({
16-
OperationResult: 'foo'
20+
Str: 'foo'
1721
});
1822
})
1923
});
@@ -295,6 +299,30 @@ describe('XmlBodyParser', () => {
295299
});
296300
});
297301

302+
it('should parse flattened list with only 1 item', () => {
303+
let xml = '<xml><Items>Jack</Items></xml>';
304+
let rules: Member = {
305+
shape: {
306+
type: "structure",
307+
required: [],
308+
members: {
309+
Items: {
310+
shape: {
311+
type: "list",
312+
member: {
313+
shape: {type: "string"},
314+
},
315+
flattened: true
316+
},
317+
}
318+
}
319+
}
320+
}
321+
expect(parser.parse(rules, xml)).toEqual({
322+
Items: ['Jack']
323+
});
324+
});
325+
298326
it('should parse list with attributes in tags', () => {
299327
let xml = '<xml><Item xsi:name="Jon"><Age>20</Age></Item><Item xsi:name="Lee"><Age>18</Age></Item></xml>';
300328
let rules: Member = {
@@ -580,15 +608,15 @@ describe('XmlBodyParser', () => {
580608
expect(parser.parse(rules, xml)).toEqual({
581609
CreatedAt: new Date(rfcString)
582610
});
583-
})
611+
});
584612

585613
it('should parse unixTimestamp', () => {
586614
let unixTime = 1398796238;
587615
let xml = `<xml><CreatedAt>${unixTime}</CreatedAt></xml>`;
588616
expect(parser.parse(rules, xml)).toEqual({
589617
CreatedAt: new Date(unixTime * 1000)
590618
});
591-
})
619+
});
592620
});
593621

594622
describe('string', () => {
@@ -797,20 +825,24 @@ describe('XmlBodyParser', () => {
797825
it('should extract requestId from non-EC2 response body', () => {
798826
let rules: Member = {
799827
shape: {
800-
type: 'string'
828+
type: 'structure',
829+
required: [],
830+
members: {
831+
Str: {shape: {type: 'string'}}
832+
}
801833
},
802834
resultWrapper: 'QueryResult'
803835
}
804836
const xml = `
805837
<OperationNameResponse>
806-
<QueryResult>foo</QueryResult>
838+
<QueryResult><Str>foo</Str></QueryResult>
807839
<ResponseMetadata>
808840
<RequestId>request-id</RequestId>
809841
</ResponseMetadata>
810842
</OperationNameResponse>
811843
`
812844
expect(parser.parse(rules, xml)).toEqual({
813-
QueryResult: 'foo',
845+
Str: 'foo',
814846
$metadata: {
815847
requestId: 'request-id'
816848
}

packages/xml-body-parser/src/index.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@ export class XmlBodyParser implements BodyParser {
5353
}
5454
}
5555
let data: OutputType = this.unmarshall(wrappedShape, xmlObj);
56+
if (member.resultWrapper) {
57+
data = (data as any)[member.resultWrapper]
58+
}
5659
//standard query
5760
if (xmlObj.ResponseMetadata && xmlObj.ResponseMetadata.RequestId) {
5861
(data as any).$metadata = {
@@ -140,7 +143,7 @@ export class XmlBodyParser implements BodyParser {
140143
}
141144
if (!Array.isArray(xmlObj)) {
142145
const key = shape.member.locationName || 'member';
143-
xmlList = xmlObj[key];
146+
xmlList = shape.flattened ? xmlObj : xmlObj[key];
144147
if (!xmlList || Object.keys(xmlList).length === 0) {
145148
return list;
146149
}

0 commit comments

Comments
 (0)