From 803fc2092000dd64894e963a9eb4e55ff44c59bc Mon Sep 17 00:00:00 2001 From: Sarangan Rajamanickam Date: Mon, 7 Oct 2019 14:47:08 -0700 Subject: [PATCH 1/8] Add Default Error Headers --- .../lib/policies/deserializationPolicy.ts | 13 ++++ sdk/core/core-http/lib/restError.ts | 12 ++- sdk/core/core-http/lib/serviceClient.ts | 12 ++- .../policies/deserializationPolicyTests.ts | 66 +++++++++++++++- sdk/core/core-http/test/serviceClientTests.ts | 75 ++++++++++++++++++- 5 files changed, 173 insertions(+), 5 deletions(-) diff --git a/sdk/core/core-http/lib/policies/deserializationPolicy.ts b/sdk/core/core-http/lib/policies/deserializationPolicy.ts index 29161cf1742f..2748fdb8b0bc 100644 --- a/sdk/core/core-http/lib/policies/deserializationPolicy.ts +++ b/sdk/core/core-http/lib/policies/deserializationPolicy.ts @@ -155,6 +155,19 @@ export function deserializeResponseBody(jsonContentTypes: string[], xmlContentTy error.body = operationSpec.serializer.deserialize(defaultResponseBodyMapper, valueToDeserialize, "error.body"); } } + + if (parsedResponse.headers) { + const defaultResponseHeadersMapper: Mapper | undefined = + defaultResponseSpec.headersMapper; + + if (defaultResponseHeadersMapper) { + error.parsedHeaders = operationSpec.serializer.deserialize( + defaultResponseHeadersMapper, + parsedResponse.headers.rawHeaders(), + "operationRes.parsedHeaders" + ); + } + } } catch (defaultError) { error.message = `Error \"${defaultError.message}\" occurred in deserializing the responseBody - \"${parsedResponse.bodyAsText}\" for the default response.`; } diff --git a/sdk/core/core-http/lib/restError.ts b/sdk/core/core-http/lib/restError.ts index 7609ea3e6590..1d0af66161c2 100644 --- a/sdk/core/core-http/lib/restError.ts +++ b/sdk/core/core-http/lib/restError.ts @@ -14,13 +14,23 @@ export class RestError extends Error { request?: WebResource; response?: HttpOperationResponse; body?: any; - constructor(message: string, code?: string, statusCode?: number, request?: WebResource, response?: HttpOperationResponse, body?: any) { + parsedHeaders?: { [key: string]: any }; + constructor( + message: string, + code?: string, + statusCode?: number, + request?: WebResource, + response?: HttpOperationResponse, + body?: any, + parsedHeaders?: { [key: string]: any } + ) { super(message); this.code = code; this.statusCode = statusCode; this.request = request; this.response = response; this.body = body; + this.parsedHeaders = parsedHeaders; Object.setPrototypeOf(this, RestError.prototype); } diff --git a/sdk/core/core-http/lib/serviceClient.ts b/sdk/core/core-http/lib/serviceClient.ts index ac32512647f3..e43c87762a00 100644 --- a/sdk/core/core-http/lib/serviceClient.ts +++ b/sdk/core/core-http/lib/serviceClient.ts @@ -354,7 +354,17 @@ export class ServiceClient { } result = this.sendRequest(httpRequest) - .then(res => flattenResponse(res, operationSpec.responses[res.status])); + .then(res => flattenResponse(res, operationSpec.responses[res.status])) + .catch(ex => + Promise.reject( + flattenResponse( + ex, + operationSpec.responses[ex.statusCode]? + operationSpec.responses[ex.statusCode] : + operationSpec.responses["default"] + ) + ) + ); } catch (error) { result = Promise.reject(error); } diff --git a/sdk/core/core-http/test/policies/deserializationPolicyTests.ts b/sdk/core/core-http/test/policies/deserializationPolicyTests.ts index 1e43b4a329a1..bfc82d4f919a 100644 --- a/sdk/core/core-http/test/policies/deserializationPolicyTests.ts +++ b/sdk/core/core-http/test/policies/deserializationPolicyTests.ts @@ -4,7 +4,7 @@ import { assert } from "chai"; import { HttpHeaders } from "../../lib/httpHeaders"; import { HttpOperationResponse } from "../../lib/httpOperationResponse"; -import { HttpClient, OperationSpec, Serializer } from "../../lib/coreHttp"; +import { HttpClient, OperationSpec, Serializer, CompositeMapper } from "../../lib/coreHttp"; import { DeserializationPolicy, deserializationPolicy, deserializeResponseBody, defaultJsonContentTypes, defaultXmlContentTypes } from "../../lib/policies/deserializationPolicy"; import { RequestPolicy, RequestPolicyOptions } from "../../lib/policies/requestPolicy"; import { WebResource } from "../../lib/webResource"; @@ -95,6 +95,70 @@ describe("deserializationPolicy", function () { }); describe(`parse(HttpOperationResponse)`, () => { + it(`with default response headers`, async function () { + const BodyMapper: CompositeMapper = { + serializedName: "getproperties-body", + type: { + name: "Composite", + className: "PropertiesBody", + modelProperties: { + message: { + type: { + name: "String" + } + } + } + } + }; + + const HeadersMapper: CompositeMapper = { + serializedName: "getproperties-headers", + type: { + name: "Composite", + className: "PropertiesHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + + const serializer = new Serializer(HeadersMapper, true); + + const operationSpec: OperationSpec = { + httpMethod: "GET", + responses: { + default: { + headersMapper: HeadersMapper, + bodyMapper: BodyMapper + } + }, + serializer + }; + + const response: HttpOperationResponse = { + request: createRequest(operationSpec), + status: 500, + headers: new HttpHeaders({ + "x-ms-error-code": "InvalidResourceNameHeader" + }), + bodyAsText: '{"message": "InvalidResourceNameBody"}' + }; + + try { + await deserializeResponse(response); + assert.strictEqual(true, false); + } catch (e) { + assert(e); + assert.strictEqual(e.parsedHeaders.errorCode, "InvalidResourceNameHeader"); + assert.strictEqual(e.message, "InvalidResourceNameBody"); + } + }); + it(`with no response headers or body`, async function () { const response: HttpOperationResponse = { request: createRequest(), diff --git a/sdk/core/core-http/test/serviceClientTests.ts b/sdk/core/core-http/test/serviceClientTests.ts index 81df46fe2ad4..5991fff8381c 100644 --- a/sdk/core/core-http/test/serviceClientTests.ts +++ b/sdk/core/core-http/test/serviceClientTests.ts @@ -4,10 +4,10 @@ import { assert } from "chai"; import { HttpClient } from "../lib/httpClient"; import { QueryCollectionFormat } from "../lib/queryCollectionFormat"; -import { DictionaryMapper, MapperType, Serializer, Mapper } from "../lib/serializer"; +import { DictionaryMapper, MapperType, Serializer, Mapper, CompositeMapper } from "../lib/serializer"; import { serializeRequestBody, ServiceClient, getOperationArgumentValueFromParameterPath } from "../lib/serviceClient"; import { WebResource } from "../lib/webResource"; -import { OperationArguments, HttpHeaders, deserializationPolicy, RestResponse, isNode } from "../lib/coreHttp"; +import { OperationArguments, HttpHeaders, deserializationPolicy, RestResponse, isNode, OperationSpec } from "../lib/coreHttp"; import { ParameterPath } from "../lib/operationParameter"; describe("ServiceClient", function () { @@ -231,6 +231,77 @@ describe("ServiceClient", function () { assert.deepStrictEqual(res.slice(), [1, 2, 3]); }); + it("should deserialize error response headers", async function(){ + const BodyMapper: CompositeMapper = { + serializedName: "getproperties-body", + type: { + name: "Composite", + className: "PropertiesBody", + modelProperties: { + message: { + type: { + name: "String" + } + } + } + } + }; + + const HeadersMapper: CompositeMapper = { + serializedName: "getproperties-headers", + type: { + name: "Composite", + className: "PropertiesHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + + const serializer = new Serializer(HeadersMapper, true); + + const operationSpec: OperationSpec = { + httpMethod: "GET", + responses: { + default: { + headersMapper: HeadersMapper, + bodyMapper: BodyMapper + } + }, + baseUrl: "httpbin.org", + serializer + }; + + let request = new WebResource(); + request.operationSpec = operationSpec; + + const httpClient: HttpClient = { + sendRequest: req => { + request = req; + return Promise.resolve({ request, status: 500, headers: new HttpHeaders({ + "x-ms-error-code": "InvalidResourceNameHeader" + }), bodyAsText: '{"message": "InvalidResourceNameBody"}' }); + } + }; + + const client = new ServiceClient(undefined, { + httpClient, + requestPolicyFactories: [deserializationPolicy()] + }); + + try { + await client.sendOperationRequest({}, operationSpec); + assert.strictEqual(true, false); + } catch (ex) { + assert.strictEqual(ex.errorCode, "InvalidResourceNameHeader"); + } + }); + it("should use userAgent header name value from options", async function () { const httpClient: HttpClient = { sendRequest: (request: WebResource) => { From 521ee9d4d7f1c19536184e12fc411dce32e1bd91 Mon Sep 17 00:00:00 2001 From: Sarangan Rajamanickam Date: Mon, 7 Oct 2019 15:26:33 -0700 Subject: [PATCH 2/8] Minor changes --- sdk/core/core-http/lib/policies/deserializationPolicy.ts | 1 + sdk/core/core-http/lib/restError.ts | 2 ++ sdk/core/core-http/test/serviceClientTests.ts | 1 + 3 files changed, 4 insertions(+) diff --git a/sdk/core/core-http/lib/policies/deserializationPolicy.ts b/sdk/core/core-http/lib/policies/deserializationPolicy.ts index 2748fdb8b0bc..f80088ded672 100644 --- a/sdk/core/core-http/lib/policies/deserializationPolicy.ts +++ b/sdk/core/core-http/lib/policies/deserializationPolicy.ts @@ -153,6 +153,7 @@ export function deserializeResponseBody(jsonContentTypes: string[], xmlContentTy : []; } error.body = operationSpec.serializer.deserialize(defaultResponseBodyMapper, valueToDeserialize, "error.body"); + error.parsedBody = error.body; } } diff --git a/sdk/core/core-http/lib/restError.ts b/sdk/core/core-http/lib/restError.ts index 1d0af66161c2..e0d6d3c2395d 100644 --- a/sdk/core/core-http/lib/restError.ts +++ b/sdk/core/core-http/lib/restError.ts @@ -14,7 +14,9 @@ export class RestError extends Error { request?: WebResource; response?: HttpOperationResponse; body?: any; + parsedBody?: any; parsedHeaders?: { [key: string]: any }; + constructor( message: string, code?: string, diff --git a/sdk/core/core-http/test/serviceClientTests.ts b/sdk/core/core-http/test/serviceClientTests.ts index 5991fff8381c..c772f2e1b655 100644 --- a/sdk/core/core-http/test/serviceClientTests.ts +++ b/sdk/core/core-http/test/serviceClientTests.ts @@ -299,6 +299,7 @@ describe("ServiceClient", function () { assert.strictEqual(true, false); } catch (ex) { assert.strictEqual(ex.errorCode, "InvalidResourceNameHeader"); + assert.strictEqual(ex.message, "InvalidResourceNameBody"); } }); From 55a9a4129352413563a2aee3914097d6c57dae41 Mon Sep 17 00:00:00 2001 From: Sarangan Rajamanickam Date: Tue, 15 Oct 2019 13:35:04 -0700 Subject: [PATCH 3/8] PR Comments --- .../lib/policies/deserializationPolicy.ts | 17 ++++++----------- sdk/core/core-http/lib/restError.ts | 6 +++--- .../test/policies/deserializationPolicyTests.ts | 2 +- 3 files changed, 10 insertions(+), 15 deletions(-) diff --git a/sdk/core/core-http/lib/policies/deserializationPolicy.ts b/sdk/core/core-http/lib/policies/deserializationPolicy.ts index f80088ded672..06e5e30525a6 100644 --- a/sdk/core/core-http/lib/policies/deserializationPolicy.ts +++ b/sdk/core/core-http/lib/policies/deserializationPolicy.ts @@ -157,17 +157,12 @@ export function deserializeResponseBody(jsonContentTypes: string[], xmlContentTy } } - if (parsedResponse.headers) { - const defaultResponseHeadersMapper: Mapper | undefined = - defaultResponseSpec.headersMapper; - - if (defaultResponseHeadersMapper) { - error.parsedHeaders = operationSpec.serializer.deserialize( - defaultResponseHeadersMapper, - parsedResponse.headers.rawHeaders(), - "operationRes.parsedHeaders" - ); - } + if (parsedResponse.headers && defaultResponseSpec.headersMapper) { + error.parsedHeaders = operationSpec.serializer.deserialize( + defaultResponseSpec.headersMapper, + parsedResponse.headers.rawHeaders(), + "operationRes.parsedHeaders" + ); } } catch (defaultError) { error.message = `Error \"${defaultError.message}\" occurred in deserializing the responseBody - \"${parsedResponse.bodyAsText}\" for the default response.`; diff --git a/sdk/core/core-http/lib/restError.ts b/sdk/core/core-http/lib/restError.ts index e0d6d3c2395d..e47a8bb95507 100644 --- a/sdk/core/core-http/lib/restError.ts +++ b/sdk/core/core-http/lib/restError.ts @@ -14,8 +14,8 @@ export class RestError extends Error { request?: WebResource; response?: HttpOperationResponse; body?: any; - parsedBody?: any; - parsedHeaders?: { [key: string]: any }; + parsedBody?: unknown; + parsedHeaders?: { [key: string]: unknown }; constructor( message: string, @@ -24,7 +24,7 @@ export class RestError extends Error { request?: WebResource, response?: HttpOperationResponse, body?: any, - parsedHeaders?: { [key: string]: any } + parsedHeaders?: { [key: string]: unknown } ) { super(message); this.code = code; diff --git a/sdk/core/core-http/test/policies/deserializationPolicyTests.ts b/sdk/core/core-http/test/policies/deserializationPolicyTests.ts index bfc82d4f919a..d0f8bcfa2d28 100644 --- a/sdk/core/core-http/test/policies/deserializationPolicyTests.ts +++ b/sdk/core/core-http/test/policies/deserializationPolicyTests.ts @@ -151,7 +151,7 @@ describe("deserializationPolicy", function () { try { await deserializeResponse(response); - assert.strictEqual(true, false); + assert.fail(); } catch (e) { assert(e); assert.strictEqual(e.parsedHeaders.errorCode, "InvalidResourceNameHeader"); From aedfc4f568d47f984b3dba7aa92dc448bfe59aeb Mon Sep 17 00:00:00 2001 From: Sarangan Rajamanickam Date: Tue, 15 Oct 2019 14:24:32 -0700 Subject: [PATCH 4/8] PR Comments --- sdk/core/core-http/lib/serviceClient.ts | 29 +++++++++++++++---------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/sdk/core/core-http/lib/serviceClient.ts b/sdk/core/core-http/lib/serviceClient.ts index e43c87762a00..3dfb33d7d229 100644 --- a/sdk/core/core-http/lib/serviceClient.ts +++ b/sdk/core/core-http/lib/serviceClient.ts @@ -227,7 +227,7 @@ export class ServiceClient { * @param {OperationSpec} operationSpec The OperationSpec to use to populate the httpRequest. * @param {ServiceCallback} callback The callback to call when the response is received. */ - sendOperationRequest(operationArguments: OperationArguments, operationSpec: OperationSpec, callback?: ServiceCallback): Promise { + async sendOperationRequest(operationArguments: OperationArguments, operationSpec: OperationSpec, callback?: ServiceCallback): Promise { if (typeof operationArguments.options === "function") { callback = operationArguments.options; operationArguments.options = undefined; @@ -353,18 +353,23 @@ export class ServiceClient { httpRequest.streamResponseBody = isStreamOperation(operationSpec); } - result = this.sendRequest(httpRequest) - .then(res => flattenResponse(res, operationSpec.responses[res.status])) - .catch(ex => - Promise.reject( - flattenResponse( - ex, - operationSpec.responses[ex.statusCode]? - operationSpec.responses[ex.statusCode] : - operationSpec.responses["default"] - ) + let rawResponse: HttpOperationResponse; + let sendRequestError; + try { + rawResponse = await this.sendRequest(httpRequest) + } catch (error) { + sendRequestError = error; + } + if (sendRequestError) { + result = Promise.reject( + flattenResponse( + sendRequestError, + operationSpec.responses[sendRequestError.statusCode] || operationSpec.responses["default"] ) - ); + ) + } else { + result = Promise.resolve(flattenResponse(rawResponse!, operationSpec.responses[rawResponse!.status])); + } } catch (error) { result = Promise.reject(error); } From bb1ae1404d865a6837b756734a1a63e7568fc3ef Mon Sep 17 00:00:00 2001 From: Sarangan Rajamanickam Date: Wed, 16 Oct 2019 11:51:35 -0700 Subject: [PATCH 5/8] Added comment and Mod RestError Constructor --- sdk/core/core-http/lib/policies/deserializationPolicy.ts | 2 ++ sdk/core/core-http/lib/restError.ts | 6 ++---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/sdk/core/core-http/lib/policies/deserializationPolicy.ts b/sdk/core/core-http/lib/policies/deserializationPolicy.ts index 06e5e30525a6..d953bc5fb950 100644 --- a/sdk/core/core-http/lib/policies/deserializationPolicy.ts +++ b/sdk/core/core-http/lib/policies/deserializationPolicy.ts @@ -153,6 +153,8 @@ export function deserializeResponseBody(jsonContentTypes: string[], xmlContentTy : []; } error.body = operationSpec.serializer.deserialize(defaultResponseBodyMapper, valueToDeserialize, "error.body"); + // The following line is required so the flattening response (serviceClient.ts) + // will flatten the response correctly. error.parsedBody = error.body; } } diff --git a/sdk/core/core-http/lib/restError.ts b/sdk/core/core-http/lib/restError.ts index e47a8bb95507..e658819428ea 100644 --- a/sdk/core/core-http/lib/restError.ts +++ b/sdk/core/core-http/lib/restError.ts @@ -16,15 +16,14 @@ export class RestError extends Error { body?: any; parsedBody?: unknown; parsedHeaders?: { [key: string]: unknown }; - + constructor( message: string, code?: string, statusCode?: number, request?: WebResource, response?: HttpOperationResponse, - body?: any, - parsedHeaders?: { [key: string]: unknown } + body?: any ) { super(message); this.code = code; @@ -32,7 +31,6 @@ export class RestError extends Error { this.request = request; this.response = response; this.body = body; - this.parsedHeaders = parsedHeaders; Object.setPrototypeOf(this, RestError.prototype); } From 83c6fe7fbdd856b1dfe848764628c97d02faf5ab Mon Sep 17 00:00:00 2001 From: Sarangan Rajamanickam Date: Fri, 18 Oct 2019 15:03:21 -0700 Subject: [PATCH 6/8] Added Details to RestError --- sdk/core/core-http/lib/restError.ts | 1 + sdk/core/core-http/lib/serviceClient.ts | 11 ++++++----- sdk/core/core-http/test/serviceClientTests.ts | 4 ++-- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/sdk/core/core-http/lib/restError.ts b/sdk/core/core-http/lib/restError.ts index 6a12f0ba5fd9..c2837343a852 100644 --- a/sdk/core/core-http/lib/restError.ts +++ b/sdk/core/core-http/lib/restError.ts @@ -16,6 +16,7 @@ export class RestError extends Error { body?: any; parsedBody?: unknown; parsedHeaders?: { [key: string]: unknown }; + details?: unknown; constructor( message: string, code?: string, diff --git a/sdk/core/core-http/lib/serviceClient.ts b/sdk/core/core-http/lib/serviceClient.ts index 5468505e112d..105d24c8ce80 100644 --- a/sdk/core/core-http/lib/serviceClient.ts +++ b/sdk/core/core-http/lib/serviceClient.ts @@ -439,12 +439,13 @@ export class ServiceClient { sendRequestError = error; } if (sendRequestError) { + sendRequestError.details = flattenResponse( + sendRequestError, + operationSpec.responses[sendRequestError.statusCode] || + operationSpec.responses["default"] + ); result = Promise.reject( - flattenResponse( - sendRequestError, - operationSpec.responses[sendRequestError.statusCode] || - operationSpec.responses["default"] - ) + sendRequestError ); } else { result = Promise.resolve( diff --git a/sdk/core/core-http/test/serviceClientTests.ts b/sdk/core/core-http/test/serviceClientTests.ts index ac368bb1044e..999cae372190 100644 --- a/sdk/core/core-http/test/serviceClientTests.ts +++ b/sdk/core/core-http/test/serviceClientTests.ts @@ -1041,8 +1041,8 @@ describe("ServiceClient", function() { await client.sendOperationRequest({}, operationSpec); assert.fail(); } catch (ex) { - assert.strictEqual(ex.errorCode, "InvalidResourceNameHeader"); - assert.strictEqual(ex.message, "InvalidResourceNameBody"); + assert.strictEqual(ex.details.errorCode, "InvalidResourceNameHeader"); + assert.strictEqual(ex.details.message, "InvalidResourceNameBody"); } }); }); From ef4496ca4ebb6faef9d4e133dee10cf88d600a88 Mon Sep 17 00:00:00 2001 From: Sarangan Rajamanickam Date: Fri, 18 Oct 2019 16:02:45 -0700 Subject: [PATCH 7/8] Remove additional params --- sdk/core/core-http/lib/policies/deserializationPolicy.ts | 8 ++++---- sdk/core/core-http/lib/restError.ts | 2 -- sdk/core/core-http/lib/serviceClient.ts | 2 +- .../core-http/test/policies/deserializationPolicyTests.ts | 4 ++-- 4 files changed, 7 insertions(+), 9 deletions(-) diff --git a/sdk/core/core-http/lib/policies/deserializationPolicy.ts b/sdk/core/core-http/lib/policies/deserializationPolicy.ts index 3ec88b715f1e..748bf64cb510 100644 --- a/sdk/core/core-http/lib/policies/deserializationPolicy.ts +++ b/sdk/core/core-http/lib/policies/deserializationPolicy.ts @@ -198,14 +198,14 @@ export function deserializeResponseBody( valueToDeserialize, "error.body" ); - // The following line is required to flatten the response correctly - // in serviceClient.ts - error.parsedBody = error.body; + // The following line is added to not introduce + // any breaking change by removing error.body + error.response!.parsedBody = error.body; } } if (parsedResponse.headers && defaultResponseSpec.headersMapper) { - error.parsedHeaders = operationSpec.serializer.deserialize( + error.response!.parsedHeaders = operationSpec.serializer.deserialize( defaultResponseSpec.headersMapper, parsedResponse.headers.rawHeaders(), "operationRes.parsedHeaders" diff --git a/sdk/core/core-http/lib/restError.ts b/sdk/core/core-http/lib/restError.ts index c2837343a852..5033a6cce3fe 100644 --- a/sdk/core/core-http/lib/restError.ts +++ b/sdk/core/core-http/lib/restError.ts @@ -14,8 +14,6 @@ export class RestError extends Error { request?: WebResource; response?: HttpOperationResponse; body?: any; - parsedBody?: unknown; - parsedHeaders?: { [key: string]: unknown }; details?: unknown; constructor( message: string, diff --git a/sdk/core/core-http/lib/serviceClient.ts b/sdk/core/core-http/lib/serviceClient.ts index 105d24c8ce80..84b052d6469f 100644 --- a/sdk/core/core-http/lib/serviceClient.ts +++ b/sdk/core/core-http/lib/serviceClient.ts @@ -440,7 +440,7 @@ export class ServiceClient { } if (sendRequestError) { sendRequestError.details = flattenResponse( - sendRequestError, + sendRequestError.response, operationSpec.responses[sendRequestError.statusCode] || operationSpec.responses["default"] ); diff --git a/sdk/core/core-http/test/policies/deserializationPolicyTests.ts b/sdk/core/core-http/test/policies/deserializationPolicyTests.ts index 46931e18ae79..7ca6b4fdd8a5 100644 --- a/sdk/core/core-http/test/policies/deserializationPolicyTests.ts +++ b/sdk/core/core-http/test/policies/deserializationPolicyTests.ts @@ -561,8 +561,8 @@ describe("deserializationPolicy", function() { assert.fail(); } catch (e) { assert(e); - assert.strictEqual(e.parsedHeaders.errorCode, "InvalidResourceNameHeader"); - assert.strictEqual(e.message, "InvalidResourceNameBody"); + assert.strictEqual(e.response.parsedHeaders.errorCode, "InvalidResourceNameHeader"); + assert.strictEqual(e.response.parsedBody.message, "InvalidResourceNameBody"); } }); }); From 7241b9f80c6cf699753c95520a8e43b728cf3b9d Mon Sep 17 00:00:00 2001 From: Sarangan Rajamanickam Date: Fri, 18 Oct 2019 16:15:32 -0700 Subject: [PATCH 8/8] Minor change --- .../core-http/lib/policies/deserializationPolicy.ts | 3 +-- sdk/core/core-http/lib/serviceClient.ts | 12 +++++++----- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/sdk/core/core-http/lib/policies/deserializationPolicy.ts b/sdk/core/core-http/lib/policies/deserializationPolicy.ts index 748bf64cb510..c8f2025922bb 100644 --- a/sdk/core/core-http/lib/policies/deserializationPolicy.ts +++ b/sdk/core/core-http/lib/policies/deserializationPolicy.ts @@ -198,8 +198,7 @@ export function deserializeResponseBody( valueToDeserialize, "error.body" ); - // The following line is added to not introduce - // any breaking change by removing error.body + // Setting the parsedBody on response to enable flattening as per operationSpec error.response!.parsedBody = error.body; } } diff --git a/sdk/core/core-http/lib/serviceClient.ts b/sdk/core/core-http/lib/serviceClient.ts index 84b052d6469f..580ae5e62d0b 100644 --- a/sdk/core/core-http/lib/serviceClient.ts +++ b/sdk/core/core-http/lib/serviceClient.ts @@ -439,11 +439,13 @@ export class ServiceClient { sendRequestError = error; } if (sendRequestError) { - sendRequestError.details = flattenResponse( - sendRequestError.response, - operationSpec.responses[sendRequestError.statusCode] || - operationSpec.responses["default"] - ); + if (sendRequestError.response){ + sendRequestError.details = flattenResponse( + sendRequestError.response, + operationSpec.responses[sendRequestError.statusCode] || + operationSpec.responses["default"] + ); + } result = Promise.reject( sendRequestError );