From c5cd31f484af50ebcf93e8df8b293f82ce927b9c Mon Sep 17 00:00:00 2001 From: Allan Zheng Date: Wed, 12 Aug 2020 17:28:01 -0700 Subject: [PATCH] fix UnknownEndpoint exception not thrown in Node14(#3393) --- .../bugfix-ErrorParser-eb144db2.json | 5 +++++ lib/event_listeners.js | 8 +++++++- lib/node_loader.js | 1 + test/event_listeners.spec.js | 18 ++++++++++++++++++ 4 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 .changes/next-release/bugfix-ErrorParser-eb144db2.json diff --git a/.changes/next-release/bugfix-ErrorParser-eb144db2.json b/.changes/next-release/bugfix-ErrorParser-eb144db2.json new file mode 100644 index 0000000000..a7dea83e6d --- /dev/null +++ b/.changes/next-release/bugfix-ErrorParser-eb144db2.json @@ -0,0 +1,5 @@ +{ + "type": "bugfix", + "category": "ErrorParser", + "description": "fix UnknownEndpoint exception not thrown in Node14(#3393)" +} \ No newline at end of file diff --git a/lib/event_listeners.js b/lib/event_listeners.js index df917b4b83..a56784b04b 100644 --- a/lib/event_listeners.js +++ b/lib/event_listeners.js @@ -494,7 +494,13 @@ AWS.EventListeners = { add('EXTRACT_REQUEST_ID', 'extractError', AWS.util.extractRequestId); add('ENOTFOUND_ERROR', 'httpError', function ENOTFOUND_ERROR(err) { - if (err.code === 'NetworkingError' && err.errno === 'ENOTFOUND') { + function isDNSError(err) { + return err.errno === 'ENOTFOUND' || + typeof err.errno === 'number' && + typeof AWS.util.getSystemErrorName === 'function' && + ['EAI_NONAME', 'EAI_NODATA'].indexOf(AWS.util.getSystemErrorName(err.errno) >= 0); + } + if (err.code === 'NetworkingError' && isDNSError(err)) { var message = 'Inaccessible host: `' + err.hostname + '\'. This service may not be available in the `' + err.region + '\' region.'; diff --git a/lib/node_loader.js b/lib/node_loader.js index ce068e3c73..eba8c2acf2 100644 --- a/lib/node_loader.js +++ b/lib/node_loader.js @@ -19,6 +19,7 @@ util.clientSideMonitoring = { configProvider: require('./publisher/configuration'), }; util.iniLoader = require('./shared-ini').iniLoader; +util.getSystemErrorName = require('util').getSystemErrorName; var AWS; diff --git a/test/event_listeners.spec.js b/test/event_listeners.spec.js index 8a6f9f3386..269ebaab25 100644 --- a/test/event_listeners.spec.js +++ b/test/event_listeners.spec.js @@ -594,6 +594,24 @@ expect(request.response.error.code).to.equal('UnknownEndpoint'); return expect(request.response.error.message).to.contain('This service may not be available in the `mock-region\' region.'); }); + if (AWS.util.getSystemErrorName) { + // errno is a number after Node 12 + // reference: https://github.com/nodejs/node/pull/28140 + it('rewrites ENOTFOUND error to include helpful message when errno is number', function() { + var request; + helpers.mockHttpResponse({ + code: 'NetworkingError', + errno: -3008, + region: 'mock-region', + hostname: 'svc.mock-region.example.com', + retryable: true + }); + request = makeRequest(); + request.send(); + expect(request.response.error.code).to.equal('UnknownEndpoint'); + return expect(request.response.error.message).to.contain('This service may not be available in the `mock-region\' region.'); + }); + } return it('retries ENOTFOUND errors', function() { var request, response, sendHandler; helpers.mockHttpResponse({