diff --git a/packages/amazon-cognito-identity-js/src/Client.js b/packages/amazon-cognito-identity-js/src/Client.js index 1a5e41bbd4a..1a941a8649f 100644 --- a/packages/amazon-cognito-identity-js/src/Client.js +++ b/packages/amazon-cognito-identity-js/src/Client.js @@ -23,7 +23,7 @@ export default class Client { const headers = { 'Content-Type': 'application/x-amz-json-1.1', 'X-Amz-Target': `AWSCognitoIdentityProviderService.${operation}`, - 'X-Amz-User-Agent': this.userAgent + 'X-Amz-User-Agent': this.userAgent, }; const options = { @@ -40,6 +40,13 @@ export default class Client { .then(resp => { response = resp; return resp; + }, err => { + // If error happens here, the request failed + // if it is TypeError throw network error + if (err instanceof TypeError) { + throw new Error('Network error'); + } + throw err; }) .then(resp => resp.json().catch(() => ({}))) .then(data => { @@ -55,15 +62,31 @@ export default class Client { }; return callback(error); }) - .catch(() => { - // Taken from aws-sdk-js/lib/protocol/json.js - const code = (response.headers.get('x-amzn-errortype') || 'UnknownError').split(':')[0]; - const error = { - code, - name: code, - statusCode: response.status, - message: response.status.toString(), - }; + .catch(err => { + // default to return 'UnknownError' + let error = { code: 'UnknownError', message: 'Unkown error' }; + + // first check if we have a service error + if (response && response.headers && response.headers.get('x-amzn-errortype')) { + try { + const code = (response.headers.get('x-amz-errortype')).split(':')[0]; + error = { + code, + name: code, + statusCode: response.status, + message: (response.status) ? response.status.toString() : null, + }; + } catch (ex) { + // pass through so it doesn't get swallowed if we can't parse it + } + // otherwise check if error is Network error + } else if (err instanceof Error && err.message === 'Network error') { + error = { + code: err.name, + name: err.name, + message: err.message, + }; + } return callback(error); }); }