|
'use strict';
|
|
const urlLib = require('url');
|
|
const http = require('http');
|
|
const PCancelable = require('p-cancelable');
|
|
const is = require('@sindresorhus/is');
|
|
|
|
class GotError extends Error {
|
|
constructor(message, error, opts) {
|
|
super(message);
|
|
Error.captureStackTrace(this, this.constructor);
|
|
this.name = 'GotError';
|
|
|
|
if (!is.undefined(error.code)) {
|
|
this.code = error.code;
|
|
}
|
|
|
|
Object.assign(this, {
|
|
host: opts.host,
|
|
hostname: opts.hostname,
|
|
method: opts.method,
|
|
path: opts.path,
|
|
socketPath: opts.socketPath,
|
|
protocol: opts.protocol,
|
|
url: opts.href
|
|
});
|
|
}
|
|
}
|
|
|
|
module.exports.GotError = GotError;
|
|
|
|
module.exports.CacheError = class extends GotError {
|
|
constructor(error, opts) {
|
|
super(error.message, error, opts);
|
|
this.name = 'CacheError';
|
|
}
|
|
};
|
|
|
|
module.exports.RequestError = class extends GotError {
|
|
constructor(error, opts) {
|
|
super(error.message, error, opts);
|
|
this.name = 'RequestError';
|
|
}
|
|
};
|
|
|
|
module.exports.ReadError = class extends GotError {
|
|
constructor(error, opts) {
|
|
super(error.message, error, opts);
|
|
this.name = 'ReadError';
|
|
}
|
|
};
|
|
|
|
module.exports.ParseError = class extends GotError {
|
|
constructor(error, statusCode, opts, data) {
|
|
super(`${error.message} in "${urlLib.format(opts)}": \n${data.slice(0, 77)}...`, error, opts);
|
|
this.name = 'ParseError';
|
|
this.statusCode = statusCode;
|
|
this.statusMessage = http.STATUS_CODES[this.statusCode];
|
|
}
|
|
};
|
|
|
|
module.exports.HTTPError = class extends GotError {
|
|
constructor(response, opts) {
|
|
const {statusCode} = response;
|
|
let {statusMessage} = response;
|
|
|
|
if (statusMessage) {
|
|
statusMessage = statusMessage.replace(/\r?\n/g, ' ').trim();
|
|
} else {
|
|
statusMessage = http.STATUS_CODES[statusCode];
|
|
}
|
|
super(`Response code ${statusCode} (${statusMessage})`, {}, opts);
|
|
this.name = 'HTTPError';
|
|
this.statusCode = statusCode;
|
|
this.statusMessage = statusMessage;
|
|
this.headers = response.headers;
|
|
this.body = response.body;
|
|
}
|
|
};
|
|
|
|
module.exports.MaxRedirectsError = class extends GotError {
|
|
constructor(statusCode, redirectUrls, opts) {
|
|
super('Redirected 10 times. Aborting.', {}, opts);
|
|
this.name = 'MaxRedirectsError';
|
|
this.statusCode = statusCode;
|
|
this.statusMessage = http.STATUS_CODES[this.statusCode];
|
|
this.redirectUrls = redirectUrls;
|
|
}
|
|
};
|
|
|
|
module.exports.UnsupportedProtocolError = class extends GotError {
|
|
constructor(opts) {
|
|
super(`Unsupported protocol "${opts.protocol}"`, {}, opts);
|
|
this.name = 'UnsupportedProtocolError';
|
|
}
|
|
};
|
|
|
|
module.exports.TimeoutError = class extends GotError {
|
|
constructor(error, opts) {
|
|
super(error.message, {code: 'ETIMEDOUT'}, opts);
|
|
this.name = 'TimeoutError';
|
|
this.event = error.event;
|
|
}
|
|
};
|
|
|
|
module.exports.CancelError = PCancelable.CancelError;
|