UNPKG

axios

Version:

Promise based HTTP client for the browser and node.js

174 lines (143 loc) 4.43 kB
'use strict'; var utils = require('../utils'); var DEFAULT_REDACT_KEYS = require('../helpers/defaultRedactKeys'); var REDACTED_VALUE = '[REDACTED ****]'; function makeValueDescriptor(value) { var descriptor = Object.create(null); descriptor.value = value; return descriptor; } function getRedactKeys(config) { // An empty array is treated as "no override" so an upstream `redact: []` cannot // silently disable redaction. To opt out, pass non-string values or unset keys. var override = config && utils.isArray(config.redact) && config.redact.length ? config.redact : null; var redact = override || DEFAULT_REDACT_KEYS; var keys = {}; utils.forEach(redact, function eachRedactKey(key) { if (typeof key === 'string') { keys[key.toLowerCase()] = true; } }); return keys; } function shouldRedact(key, keys) { return typeof key === 'string' && keys[key.toLowerCase()]; } var CIRCULAR_VALUE = '[Circular]'; function serializeConfigValue(value, keys, key, seen) { var result; if (shouldRedact(key, keys)) { return REDACTED_VALUE; } if (utils.isArray(value)) { if (seen.indexOf(value) !== -1) { return CIRCULAR_VALUE; } seen.push(value); result = []; utils.forEach(value, function eachArrayValue(item, index) { result[index] = serializeConfigValue(item, keys, index, seen); }); seen.pop(); return result; } if (utils.isPlainObject(value)) { if (seen.indexOf(value) !== -1) { return CIRCULAR_VALUE; } seen.push(value); result = {}; utils.forEach(value, function eachObjectValue(item, itemKey) { result[itemKey] = serializeConfigValue(item, keys, itemKey, seen); }); seen.pop(); return result; } return value; } function serializeConfig(config) { if (!config) { return config; } return serializeConfigValue(config, getRedactKeys(config), undefined, []); } /** * Create an Error with the specified message, config, error code, request and response. * * @param {string} message The error message. * @param {string} [code] The error code (for example, 'ECONNABORTED'). * @param {Object} [config] The config. * @param {Object} [request] The request. * @param {Object} [response] The response. * @returns {Error} The created error. */ function AxiosError(message, code, config, request, response) { Error.call(this); if (Error.captureStackTrace) { Error.captureStackTrace(this, this.constructor); } else { this.stack = (new Error()).stack; } this.message = message; this.name = 'AxiosError'; code && (this.code = code); config && (this.config = config); request && (this.request = request); response && (this.response = response); } utils.inherits(AxiosError, Error, { toJSON: function toJSON() { return { // Standard message: this.message, name: this.name, // Microsoft description: this.description, number: this.number, // Mozilla fileName: this.fileName, lineNumber: this.lineNumber, columnNumber: this.columnNumber, stack: this.stack, // Axios config: serializeConfig(this.config), code: this.code, status: this.response && this.response.status ? this.response.status : null }; } }); var prototype = AxiosError.prototype; var descriptors = Object.create(null); [ 'ERR_BAD_OPTION_VALUE', 'ERR_BAD_OPTION', 'ECONNABORTED', 'ETIMEDOUT', 'ERR_NETWORK', 'ERR_FR_TOO_MANY_REDIRECTS', 'ERR_DEPRECATED', 'ERR_BAD_RESPONSE', 'ERR_BAD_REQUEST', 'ERR_CANCELED', 'ERR_NOT_SUPPORT', 'ERR_INVALID_URL', 'ERR_FORM_DATA_DEPTH_EXCEEDED' // eslint-disable-next-line func-names ].forEach(function(code) { descriptors[code] = makeValueDescriptor(code); }); Object.defineProperties(AxiosError, descriptors); Object.defineProperty(prototype, 'isAxiosError', makeValueDescriptor(true)); // eslint-disable-next-line func-names AxiosError.from = function(error, code, config, request, response, customProps) { var axiosError = Object.create(prototype); utils.toFlatObject(error, axiosError, function filter(obj) { return obj !== Error.prototype; }); AxiosError.call(axiosError, error.message, code, config, request, response); axiosError.cause = error; axiosError.name = error.name; customProps && Object.assign(axiosError, customProps); return axiosError; }; module.exports = AxiosError;