UNPKG

robert

Version:

A generic shitty http client in nod.js

72 lines (71 loc) 3.04 kB
"use strict"; 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;