robert
Version:
A generic shitty http client in nod.js
72 lines (71 loc) • 3.04 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const errors_1 = require("./errors");
const parse_1 = require("./parse");
const https_1 = require("https");
const http_1 = require("http");
const stream_1 = require("stream");
function response(method, url, body, options) {
return new Promise((resolve, reject) => {
const make = url.protocol === "https:" ? https_1.request : http_1.request;
const req = make(url, {
method,
port: options.port,
// @ts-ignore pain
headers: options.headers,
timeout: options.timeout,
}, (res) => {
res.on("error", (error) => reject(error));
if (res.headers.location) {
if (options.redirects === 0)
reject(new errors_1.RedirectError(url.toString(), options));
switch (res.statusCode) {
case 301:
case 302:
case 308:
case 308:
options.redirects--;
url = new URL(res.headers.location, url);
return resolve(response(method, url, body, options));
case 303:
options.redirects--;
method = "GET";
url = new URL(res.headers.location, url);
body = null;
return resolve(response(method, url, body, options));
}
}
if (res.statusCode < 200 || res.statusCode >= 400)
(0, parse_1.default)(res, options.format, options.size)
.catch(() => { })
.then((data) => reject(new errors_1.ResponseError(url.toString(), options, res.statusCode, res.statusMessage, res.headers, data)));
else
(0, parse_1.default)(res, options.format, options.size)
.then((data) => resolve(options.full
? {
url,
data,
status: res.statusCode,
statusText: res.statusMessage,
headers: res.headers,
}
: data))
.catch((error) => reject(new errors_1.ParseError(url.toString(), options, options.format, error)));
});
req.on("error", (error) => reject(error));
req.on("socket", (socket) => socket.on("timeout", () => req.destroy(new errors_1.TimeoutError(url.toString(), options, options.timeout))));
if (body) {
if (body instanceof stream_1.Stream) {
body.pipe(req);
body.on("end", () => req.end());
}
else {
req.write(body);
req.end();
}
}
else
req.end();
});
}
exports.default = response;