From 37fd0fa9109bb8a90cc4f3b879019b62e4cb9946 Mon Sep 17 00:00:00 2001 From: Rich Ellis Date: Thu, 6 Nov 2025 13:34:55 +0000 Subject: [PATCH] fix: check data is present before reading errors Signed-off-by: Rich Ellis --- lib/request-wrapper.ts | 26 ++++++++++++++------------ test/unit/request-wrapper.test.js | 16 +++++++++++++++- 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/lib/request-wrapper.ts b/lib/request-wrapper.ts index abfc1d43..5ba8d3f5 100644 --- a/lib/request-wrapper.ts +++ b/lib/request-wrapper.ts @@ -648,18 +648,20 @@ function hasStringProperty(obj: any, property: string): boolean { function parseServiceErrorMessage(response: any): string | undefined { let message; - if ( - Array.isArray(response.errors) && - response.errors.length > 0 && - hasStringProperty(response.errors[0], 'message') - ) { - message = response.errors[0].message; - } else if (hasStringProperty(response, 'error')) { - message = response.error; - } else if (hasStringProperty(response, 'message')) { - message = response.message; - } else if (hasStringProperty(response, 'errorMessage')) { - message = response.errorMessage; + if (response) { + if ( + Array.isArray(response.errors) && + response.errors.length > 0 && + hasStringProperty(response.errors[0], 'message') + ) { + message = response.errors[0].message; + } else if (hasStringProperty(response, 'error')) { + message = response.error; + } else if (hasStringProperty(response, 'message')) { + message = response.message; + } else if (hasStringProperty(response, 'errorMessage')) { + message = response.errorMessage; + } } logger.info(`Parsing service error message: ${message}`); diff --git a/test/unit/request-wrapper.test.js b/test/unit/request-wrapper.test.js index 330c7f6a..9c83d3f5 100644 --- a/test/unit/request-wrapper.test.js +++ b/test/unit/request-wrapper.test.js @@ -1,5 +1,5 @@ /** - * (C) Copyright IBM Corp. 2019, 2021. + * (C) Copyright IBM Corp. 2019, 2025. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -1015,6 +1015,20 @@ describe('formatError', () => { 'Malformed JSON string: { "errorMessage": "some error"' ); }); + + it('should not throw TypeError reading properties for a response with no data', () => { + expect(() => + requestWrapperInstance.formatError({ + request: 'fake-http-request-object', + response: { + statusText: 'OK', + status: 200, + }, + message: 'timed out', + code: 'ETIMEDOUT', + }) + ).not.toThrow(); + }); }); describe('getHttpClient', () => {