@@ -14,6 +14,7 @@ import {
1414 RequestPolicyFactory ,
1515 RequestPolicyOptions
1616} from "./requestPolicy" ;
17+ import { XML_CHARKEY , SerializerOptions } from "../util/serializer.common" ;
1718
1819/**
1920 * Options to configure API response deserialization.
@@ -49,11 +50,17 @@ export interface DeserializationContentTypes {
4950 * pass through the HTTP pipeline.
5051 */
5152export function deserializationPolicy (
52- deserializationContentTypes ?: DeserializationContentTypes
53+ deserializationContentTypes ?: DeserializationContentTypes ,
54+ parsingOptions ?: SerializerOptions
5355) : RequestPolicyFactory {
5456 return {
5557 create : ( nextPolicy : RequestPolicy , options : RequestPolicyOptions ) => {
56- return new DeserializationPolicy ( nextPolicy , deserializationContentTypes , options ) ;
58+ return new DeserializationPolicy (
59+ nextPolicy ,
60+ options ,
61+ deserializationContentTypes ,
62+ parsingOptions
63+ ) ;
5764 }
5865 } ;
5966}
@@ -75,26 +82,29 @@ export const DefaultDeserializationOptions: DeserializationOptions = {
7582export class DeserializationPolicy extends BaseRequestPolicy {
7683 public readonly jsonContentTypes : string [ ] ;
7784 public readonly xmlContentTypes : string [ ] ;
85+ public readonly xmlCharKey : string ;
7886
7987 constructor (
8088 nextPolicy : RequestPolicy ,
81- deserializationContentTypes : DeserializationContentTypes | undefined ,
82- options : RequestPolicyOptions
89+ requestPolicyOptions : RequestPolicyOptions ,
90+ deserializationContentTypes ?: DeserializationContentTypes ,
91+ parsingOptions : SerializerOptions = { }
8392 ) {
84- super ( nextPolicy , options ) ;
93+ super ( nextPolicy , requestPolicyOptions ) ;
8594
8695 this . jsonContentTypes =
8796 ( deserializationContentTypes && deserializationContentTypes . json ) || defaultJsonContentTypes ;
8897 this . xmlContentTypes =
8998 ( deserializationContentTypes && deserializationContentTypes . xml ) || defaultXmlContentTypes ;
99+ this . xmlCharKey = parsingOptions . xmlCharKey ?? XML_CHARKEY ;
90100 }
91101
92102 public async sendRequest ( request : WebResourceLike ) : Promise < HttpOperationResponse > {
93- return this . _nextPolicy
94- . sendRequest ( request )
95- . then ( ( response : HttpOperationResponse ) =>
96- deserializeResponseBody ( this . jsonContentTypes , this . xmlContentTypes , response )
97- ) ;
103+ return this . _nextPolicy . sendRequest ( request ) . then ( ( response : HttpOperationResponse ) =>
104+ deserializeResponseBody ( this . jsonContentTypes , this . xmlContentTypes , response , {
105+ xmlCharKey : this . xmlCharKey
106+ } )
107+ ) ;
98108 }
99109}
100110
@@ -137,74 +147,84 @@ function shouldDeserializeResponse(parsedResponse: HttpOperationResponse): boole
137147export function deserializeResponseBody (
138148 jsonContentTypes : string [ ] ,
139149 xmlContentTypes : string [ ] ,
140- response : HttpOperationResponse
150+ response : HttpOperationResponse ,
151+ options : SerializerOptions = { }
141152) : Promise < HttpOperationResponse > {
142- return parse ( jsonContentTypes , xmlContentTypes , response ) . then ( ( parsedResponse ) => {
143- if ( ! shouldDeserializeResponse ( parsedResponse ) ) {
144- return parsedResponse ;
145- }
153+ const updatedOptions : Required < SerializerOptions > = {
154+ rootName : options . rootName ?? "" ,
155+ includeRoot : options . includeRoot ?? false ,
156+ xmlCharKey : options . xmlCharKey ?? XML_CHARKEY
157+ } ;
158+ return parse ( jsonContentTypes , xmlContentTypes , response , updatedOptions ) . then (
159+ ( parsedResponse ) => {
160+ if ( ! shouldDeserializeResponse ( parsedResponse ) ) {
161+ return parsedResponse ;
162+ }
146163
147- const operationSpec = parsedResponse . request . operationSpec ;
148- if ( ! operationSpec || ! operationSpec . responses ) {
149- return parsedResponse ;
150- }
164+ const operationSpec = parsedResponse . request . operationSpec ;
165+ if ( ! operationSpec || ! operationSpec . responses ) {
166+ return parsedResponse ;
167+ }
151168
152- const responseSpec = getOperationResponse ( parsedResponse ) ;
169+ const responseSpec = getOperationResponse ( parsedResponse ) ;
153170
154- const { error, shouldReturnResponse } = handleErrorResponse (
155- parsedResponse ,
156- operationSpec ,
157- responseSpec
158- ) ;
159- if ( error ) {
160- throw error ;
161- } else if ( shouldReturnResponse ) {
162- return parsedResponse ;
163- }
171+ const { error, shouldReturnResponse } = handleErrorResponse (
172+ parsedResponse ,
173+ operationSpec ,
174+ responseSpec
175+ ) ;
176+ if ( error ) {
177+ throw error ;
178+ } else if ( shouldReturnResponse ) {
179+ return parsedResponse ;
180+ }
164181
165- // An operation response spec does exist for current status code, so
166- // use it to deserialize the response.
167- if ( responseSpec ) {
168- if ( responseSpec . bodyMapper ) {
169- let valueToDeserialize : any = parsedResponse . parsedBody ;
170- if ( operationSpec . isXML && responseSpec . bodyMapper . type . name === MapperType . Sequence ) {
171- valueToDeserialize =
172- typeof valueToDeserialize === "object"
173- ? valueToDeserialize [ responseSpec . bodyMapper . xmlElementName ! ]
174- : [ ] ;
182+ // An operation response spec does exist for current status code, so
183+ // use it to deserialize the response.
184+ if ( responseSpec ) {
185+ if ( responseSpec . bodyMapper ) {
186+ let valueToDeserialize : any = parsedResponse . parsedBody ;
187+ if ( operationSpec . isXML && responseSpec . bodyMapper . type . name === MapperType . Sequence ) {
188+ valueToDeserialize =
189+ typeof valueToDeserialize === "object"
190+ ? valueToDeserialize [ responseSpec . bodyMapper . xmlElementName ! ]
191+ : [ ] ;
192+ }
193+ try {
194+ parsedResponse . parsedBody = operationSpec . serializer . deserialize (
195+ responseSpec . bodyMapper ,
196+ valueToDeserialize ,
197+ "operationRes.parsedBody" ,
198+ options
199+ ) ;
200+ } catch ( error ) {
201+ const restError = new RestError (
202+ `Error ${ error } occurred in deserializing the responseBody - ${ parsedResponse . bodyAsText } ` ,
203+ undefined ,
204+ parsedResponse . status ,
205+ parsedResponse . request ,
206+ parsedResponse
207+ ) ;
208+ throw restError ;
209+ }
210+ } else if ( operationSpec . httpMethod === "HEAD" ) {
211+ // head methods never have a body, but we return a boolean to indicate presence/absence of the resource
212+ parsedResponse . parsedBody = response . status >= 200 && response . status < 300 ;
175213 }
176- try {
177- parsedResponse . parsedBody = operationSpec . serializer . deserialize (
178- responseSpec . bodyMapper ,
179- valueToDeserialize ,
180- "operationRes.parsedBody"
181- ) ;
182- } catch ( error ) {
183- const restError = new RestError (
184- `Error ${ error } occurred in deserializing the responseBody - ${ parsedResponse . bodyAsText } ` ,
185- undefined ,
186- parsedResponse . status ,
187- parsedResponse . request ,
188- parsedResponse
214+
215+ if ( responseSpec . headersMapper ) {
216+ parsedResponse . parsedHeaders = operationSpec . serializer . deserialize (
217+ responseSpec . headersMapper ,
218+ parsedResponse . headers . rawHeaders ( ) ,
219+ "operationRes.parsedHeaders" ,
220+ options
189221 ) ;
190- throw restError ;
191222 }
192- } else if ( operationSpec . httpMethod === "HEAD" ) {
193- // head methods never have a body, but we return a boolean to indicate presence/absence of the resource
194- parsedResponse . parsedBody = response . status >= 200 && response . status < 300 ;
195223 }
196224
197- if ( responseSpec . headersMapper ) {
198- parsedResponse . parsedHeaders = operationSpec . serializer . deserialize (
199- responseSpec . headersMapper ,
200- parsedResponse . headers . rawHeaders ( ) ,
201- "operationRes.parsedHeaders"
202- ) ;
203- }
225+ return parsedResponse ;
204226 }
205-
206- return parsedResponse ;
207- } ) ;
227+ ) ;
208228}
209229
210230function isOperationSpecEmpty ( operationSpec : OperationSpec ) : boolean {
@@ -305,7 +325,8 @@ function handleErrorResponse(
305325function parse (
306326 jsonContentTypes : string [ ] ,
307327 xmlContentTypes : string [ ] ,
308- operationResponse : HttpOperationResponse
328+ operationResponse : HttpOperationResponse ,
329+ opts : Required < SerializerOptions >
309330) : Promise < HttpOperationResponse > {
310331 const errorHandler = ( err : Error & { code : string } ) : Promise < never > => {
311332 const msg = `Error "${ err } " occurred while parsing the response body - ${ operationResponse . bodyAsText } .` ;
@@ -335,7 +356,7 @@ function parse(
335356 resolve ( operationResponse ) ;
336357 } ) . catch ( errorHandler ) ;
337358 } else if ( contentComponents . some ( ( component ) => xmlContentTypes . indexOf ( component ) !== - 1 ) ) {
338- return parseXML ( text )
359+ return parseXML ( text , opts )
339360 . then ( ( body ) => {
340361 operationResponse . parsedBody = body ;
341362 return operationResponse ;
0 commit comments