From 4ec1fc89754ad99000e88a936d05a37f5179d2f2 Mon Sep 17 00:00:00 2001 From: Samuel Olugbemi Date: Fri, 4 Jun 2021 03:53:44 +0300 Subject: [PATCH 1/2] Request options override --- lib/request.js | 208 ++++++++++++++++++++++++++----------------------- 1 file changed, 111 insertions(+), 97 deletions(-) diff --git a/lib/request.js b/lib/request.js index 1b4eb14..1e3c502 100644 --- a/lib/request.js +++ b/lib/request.js @@ -1,167 +1,181 @@ -'use strict' - -const semver = require('semver') -const http = require('http') -const https = require('https') -const eos = require('end-of-stream') -const pump = require('pump') -const { stripHttp1ConnectionHeaders } = require('./utils') -const undici = require('undici') - -function buildRequest (opts) { - const isHttp2 = !!opts.http2 - const isUndici = !!opts.undici +"use strict"; + +const semver = require("semver"); +const http = require("http"); +const https = require("https"); +const eos = require("end-of-stream"); +const pump = require("pump"); +const { stripHttp1ConnectionHeaders } = require("./utils"); +const undici = require("undici"); + +function buildRequest(opts) { + const isHttp2 = !!opts.http2; + const isUndici = !!opts.undici; const requests = { - 'http:': opts.requests && opts.requests.http ? opts.requests.http : http, - 'https:': opts.requests && opts.requests.https ? opts.requests.https : https - } - const baseUrl = opts.base - const rejectUnauthorized = opts.rejectUnauthorized - let h2client - let agents - let http2 - let pool + "http:": opts.requests && opts.requests.http ? opts.requests.http : http, + "https:": + opts.requests && opts.requests.https ? opts.requests.https : https, + }; + const baseUrl = opts.base; + const rejectUnauthorized = opts.rejectUnauthorized; + let h2client; + let agents; + let http2; + let pool; if (isHttp2) { - if (semver.lt(process.version, '9.0.0')) { - throw new Error('Http2 support requires Node version >= 9.0.0') + if (semver.lt(process.version, "9.0.0")) { + throw new Error("Http2 support requires Node version >= 9.0.0"); } - if (!opts.base) throw new Error('Option base is required when http2 is true') + if (!opts.base) + throw new Error("Option base is required when http2 is true"); } else { agents = { - 'http:': new http.Agent(agentOption(opts)), - 'https:': new https.Agent(agentOption(opts)) - } + "http:": new http.Agent(agentOption(opts)), + "https:": new https.Agent(agentOption(opts)), + }; } if (isHttp2) { - http2 = getHttp2() - return { request: handleHttp2Req, close } + http2 = getHttp2(); + return { request: handleHttp2Req, close }; } else if (isUndici) { - if (typeof opts.undici !== 'object') { - opts.undici = {} + if (typeof opts.undici !== "object") { + opts.undici = {}; } - pool = new undici.Pool(baseUrl, opts.undici) + pool = new undici.Pool(baseUrl, opts.undici); - return { request: handleUndici, close } + return { request: handleUndici, close }; } else { - return { request: handleHttp1Req, close } + return { request: handleHttp1Req, close }; } - function close () { + function close() { if (isUndici) { - pool.destroy() + pool.destroy(); } else if (!isHttp2) { - agents['http:'].destroy() - agents['https:'].destroy() + agents["http:"].destroy(); + agents["https:"].destroy(); } else if (h2client) { - h2client.destroy() + h2client.destroy(); } } - function handleUndici (opts, done) { + function handleUndici(opts, done) { const req = { path: opts.url.pathname + opts.qs, method: opts.method, headers: opts.headers, - body: opts.body - } + body: opts.body, + }; pool.request(req, function (err, res) { if (err) { - done(err) + done(err); } else { - setImmediate(() => done(null, { statusCode: res.statusCode, headers: res.headers, stream: res.body })) + setImmediate(() => + done(null, { + statusCode: res.statusCode, + headers: res.headers, + stream: res.body, + }) + ); } - }) + }); } - function handleHttp1Req (opts, done) { + function handleHttp1Req(opts, done) { const req = requests[opts.url.protocol].request({ - ...opts.request, method: opts.method, port: opts.url.port, path: opts.url.pathname + opts.qs, hostname: opts.url.hostname, headers: opts.headers, - agent: agents[opts.url.protocol] - }) - req.on('error', done) - req.on('timeout', () => req.abort()) - req.on('response', res => { - setImmediate(() => done(null, { statusCode: res.statusCode, headers: res.headers, stream: res })) - }) - end(req, opts.body, done) + agent: agents[opts.url.protocol], + ...opts.request, + }); + req.on("error", done); + req.on("timeout", () => req.abort()); + req.on("response", (res) => { + setImmediate(() => + done(null, { + statusCode: res.statusCode, + headers: res.headers, + stream: res, + }) + ); + }); + end(req, opts.body, done); } - function handleHttp2Req (opts, done) { + function handleHttp2Req(opts, done) { if (!h2client || h2client.destroyed) { - h2client = http2.connect(baseUrl, { rejectUnauthorized }) - h2client.once('error', done) + h2client = http2.connect(baseUrl, { rejectUnauthorized }); + h2client.once("error", done); // we might enqueue a large number of requests in this connection // before it's connected - h2client.setMaxListeners(0) - h2client.on('connect', () => { + h2client.setMaxListeners(0); + h2client.on("connect", () => { // reset the max listener to 10 on connect - h2client.setMaxListeners(10) - h2client.removeListener('error', done) - }) + h2client.setMaxListeners(10); + h2client.removeListener("error", done); + }); } const req = h2client.request({ - ':method': opts.method, - ':path': opts.url.pathname + opts.qs, - ...stripHttp1ConnectionHeaders(opts.headers) - }) + ":method": opts.method, + ":path": opts.url.pathname + opts.qs, + ...stripHttp1ConnectionHeaders(opts.headers), + }); if (opts.request && opts.request.timeout) { - req.setTimeout(opts.request.timeout) + req.setTimeout(opts.request.timeout); } - const isGet = opts.method === 'GET' || opts.method === 'get' + const isGet = opts.method === "GET" || opts.method === "get"; if (!isGet) { - end(req, opts.body, done) + end(req, opts.body, done); } - eos(req, err => { - if (err) done(err) - }) - req.on('timeout', () => { - const err = new Error('socket hang up') - err.code = 'ECONNRESET' - - req.destroy(err) - }) - req.on('response', headers => { + eos(req, (err) => { + if (err) done(err); + }); + req.on("timeout", () => { + const err = new Error("socket hang up"); + err.code = "ECONNRESET"; + + req.destroy(err); + }); + req.on("response", (headers) => { setImmediate(() => { - const statusCode = headers[':status'] - done(null, { statusCode, headers, stream: req }) - }) - }) + const statusCode = headers[":status"]; + done(null, { statusCode, headers, stream: req }); + }); + }); } } -module.exports = buildRequest +module.exports = buildRequest; -function agentOption (opts) { +function agentOption(opts) { return { keepAlive: true, keepAliveMsecs: 60 * 1000, // 1 minute maxSockets: 2048, maxFreeSockets: 2048, - ...opts - } + ...opts, + }; } -function end (req, body, cb) { - if (!body || typeof body === 'string') { - req.end(body) +function end(req, body, cb) { + if (!body || typeof body === "string") { + req.end(body); } else { - pump(body, req, err => { - if (err) cb(err) - }) + pump(body, req, (err) => { + if (err) cb(err); + }); } } // neede to avoid the experimental warning -function getHttp2 () { - return require('http2') +function getHttp2() { + return require("http2"); } From 58d3deb6f1d66f0efdafb1d7818e5b929b05e95f Mon Sep 17 00:00:00 2001 From: Samuel Olugbemi Date: Fri, 4 Jun 2021 04:00:17 +0300 Subject: [PATCH 2/2] Lint fix --- lib/request.js | 195 ++++++++++++++++++++++++------------------------- 1 file changed, 97 insertions(+), 98 deletions(-) diff --git a/lib/request.js b/lib/request.js index 1e3c502..2072289 100644 --- a/lib/request.js +++ b/lib/request.js @@ -1,90 +1,89 @@ -"use strict"; - -const semver = require("semver"); -const http = require("http"); -const https = require("https"); -const eos = require("end-of-stream"); -const pump = require("pump"); -const { stripHttp1ConnectionHeaders } = require("./utils"); -const undici = require("undici"); - -function buildRequest(opts) { - const isHttp2 = !!opts.http2; - const isUndici = !!opts.undici; +'use strict' + +const semver = require('semver') +const http = require('http') +const https = require('https') +const eos = require('end-of-stream') +const pump = require('pump') +const { stripHttp1ConnectionHeaders } = require('./utils') +const undici = require('undici') + +function buildRequest (opts) { + const isHttp2 = !!opts.http2 + const isUndici = !!opts.undici const requests = { - "http:": opts.requests && opts.requests.http ? opts.requests.http : http, - "https:": - opts.requests && opts.requests.https ? opts.requests.https : https, - }; - const baseUrl = opts.base; - const rejectUnauthorized = opts.rejectUnauthorized; - let h2client; - let agents; - let http2; - let pool; + 'http:': opts.requests && opts.requests.http ? opts.requests.http : http, + 'https:': + opts.requests && opts.requests.https ? opts.requests.https : https + } + const baseUrl = opts.base + const rejectUnauthorized = opts.rejectUnauthorized + let h2client + let agents + let http2 + let pool if (isHttp2) { - if (semver.lt(process.version, "9.0.0")) { - throw new Error("Http2 support requires Node version >= 9.0.0"); + if (semver.lt(process.version, '9.0.0')) { + throw new Error('Http2 support requires Node version >= 9.0.0') } - if (!opts.base) - throw new Error("Option base is required when http2 is true"); + if (!opts.base) { throw new Error('Option base is required when http2 is true') } } else { agents = { - "http:": new http.Agent(agentOption(opts)), - "https:": new https.Agent(agentOption(opts)), - }; + 'http:': new http.Agent(agentOption(opts)), + 'https:': new https.Agent(agentOption(opts)) + } } if (isHttp2) { - http2 = getHttp2(); - return { request: handleHttp2Req, close }; + http2 = getHttp2() + return { request: handleHttp2Req, close } } else if (isUndici) { - if (typeof opts.undici !== "object") { - opts.undici = {}; + if (typeof opts.undici !== 'object') { + opts.undici = {} } - pool = new undici.Pool(baseUrl, opts.undici); + pool = new undici.Pool(baseUrl, opts.undici) - return { request: handleUndici, close }; + return { request: handleUndici, close } } else { - return { request: handleHttp1Req, close }; + return { request: handleHttp1Req, close } } - function close() { + function close () { if (isUndici) { - pool.destroy(); + pool.destroy() } else if (!isHttp2) { - agents["http:"].destroy(); - agents["https:"].destroy(); + agents['http:'].destroy() + agents['https:'].destroy() } else if (h2client) { - h2client.destroy(); + h2client.destroy() } } - function handleUndici(opts, done) { + function handleUndici (opts, done) { const req = { path: opts.url.pathname + opts.qs, method: opts.method, headers: opts.headers, - body: opts.body, - }; + body: opts.body + } pool.request(req, function (err, res) { if (err) { - done(err); + done(err) } else { setImmediate(() => done(null, { statusCode: res.statusCode, headers: res.headers, - stream: res.body, + stream: res.body }) - ); + ) } - }); + }) } - function handleHttp1Req(opts, done) { + function handleHttp1Req (opts, done) { const req = requests[opts.url.protocol].request({ method: opts.method, port: opts.url.port, @@ -92,90 +91,90 @@ function buildRequest(opts) { hostname: opts.url.hostname, headers: opts.headers, agent: agents[opts.url.protocol], - ...opts.request, - }); - req.on("error", done); - req.on("timeout", () => req.abort()); - req.on("response", (res) => { + ...opts.request + }) + req.on('error', done) + req.on('timeout', () => req.abort()) + req.on('response', (res) => { setImmediate(() => done(null, { statusCode: res.statusCode, headers: res.headers, - stream: res, + stream: res }) - ); - }); - end(req, opts.body, done); + ) + }) + end(req, opts.body, done) } - function handleHttp2Req(opts, done) { + function handleHttp2Req (opts, done) { if (!h2client || h2client.destroyed) { - h2client = http2.connect(baseUrl, { rejectUnauthorized }); - h2client.once("error", done); + h2client = http2.connect(baseUrl, { rejectUnauthorized }) + h2client.once('error', done) // we might enqueue a large number of requests in this connection // before it's connected - h2client.setMaxListeners(0); - h2client.on("connect", () => { + h2client.setMaxListeners(0) + h2client.on('connect', () => { // reset the max listener to 10 on connect - h2client.setMaxListeners(10); - h2client.removeListener("error", done); - }); + h2client.setMaxListeners(10) + h2client.removeListener('error', done) + }) } const req = h2client.request({ - ":method": opts.method, - ":path": opts.url.pathname + opts.qs, - ...stripHttp1ConnectionHeaders(opts.headers), - }); + ':method': opts.method, + ':path': opts.url.pathname + opts.qs, + ...stripHttp1ConnectionHeaders(opts.headers) + }) if (opts.request && opts.request.timeout) { - req.setTimeout(opts.request.timeout); + req.setTimeout(opts.request.timeout) } - const isGet = opts.method === "GET" || opts.method === "get"; + const isGet = opts.method === 'GET' || opts.method === 'get' if (!isGet) { - end(req, opts.body, done); + end(req, opts.body, done) } eos(req, (err) => { - if (err) done(err); - }); - req.on("timeout", () => { - const err = new Error("socket hang up"); - err.code = "ECONNRESET"; - - req.destroy(err); - }); - req.on("response", (headers) => { + if (err) done(err) + }) + req.on('timeout', () => { + const err = new Error('socket hang up') + err.code = 'ECONNRESET' + + req.destroy(err) + }) + req.on('response', (headers) => { setImmediate(() => { - const statusCode = headers[":status"]; - done(null, { statusCode, headers, stream: req }); - }); - }); + const statusCode = headers[':status'] + done(null, { statusCode, headers, stream: req }) + }) + }) } } -module.exports = buildRequest; +module.exports = buildRequest -function agentOption(opts) { +function agentOption (opts) { return { keepAlive: true, keepAliveMsecs: 60 * 1000, // 1 minute maxSockets: 2048, maxFreeSockets: 2048, - ...opts, - }; + ...opts + } } -function end(req, body, cb) { - if (!body || typeof body === "string") { - req.end(body); +function end (req, body, cb) { + if (!body || typeof body === 'string') { + req.end(body) } else { pump(body, req, (err) => { - if (err) cb(err); - }); + if (err) cb(err) + }) } } // neede to avoid the experimental warning -function getHttp2() { - return require("http2"); +function getHttp2 () { + return require('http2') }