From ed48b778dfdc180a4396d6b7b3c51988e7184c5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Rodr=C3=ADguez?= Date: Sat, 6 Jul 2019 13:52:22 -0400 Subject: [PATCH] Fixing the support of WHATWG URLs This is an attempt to support WHATWG URLs. Feedback is appreciated! Fixes #26 --- index.js | 18 ++++++++++++++- patch-core.js | 63 +++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 70 insertions(+), 11 deletions(-) diff --git a/index.js b/index.js index 0ee6b29..f07c841 100644 --- a/index.js +++ b/index.js @@ -10,6 +10,20 @@ function isAgent(v) { return v && typeof v.addRequest === 'function'; } +function urlInstanceToObject(url) { + let urlObject = {}; + // If the opts are genearted with the WHATWG API + if (url && Object.getOwnPropertySymbols(url)[0]) { + let urlContext = url[Object.getOwnPropertySymbols(url)[0]]; + for (let key of Object.keys(urlContext)) { + urlObject[key] = urlContext[key]; + } + } else { + urlObject = Object.assign({}, url); + } + return urlObject; +} + /** * Base `http.Agent` implementation. * No pooling/keep-alive is implemented by default. @@ -18,6 +32,8 @@ function isAgent(v) { * @api public */ function Agent(callback, _opts) { + _opts = urlInstanceToObject(_opts); + if (!(this instanceof Agent)) { return new Agent(callback, _opts); } @@ -58,7 +74,7 @@ Agent.prototype.callback = function callback(req, opts) { * @api public */ Agent.prototype.addRequest = function addRequest(req, _opts) { - const ownOpts = Object.assign({}, _opts); + let ownOpts = urlInstanceToObject(_opts); // Set default `host` for HTTP to localhost if (null == ownOpts.host) { diff --git a/patch-core.js b/patch-core.js index 21cbbb6..1f52b4e 100644 --- a/patch-core.js +++ b/patch-core.js @@ -11,12 +11,35 @@ const https = require('https'); const patchMarker = "__agent_base_https_request_patched__"; if (!https.request[patchMarker]) { https.request = (function(request) { - return function(_options, cb) { + return function(_url, _options, cb) { + // Support for both + // https.request(options[, callback]) + // https.request(url[, options][, callback]) + if (typeof _url !== 'string' && !cb) { + cb = _options; + _options = _url; + _url = undefined; + } + if (!_url && _options) { + _url = url.format(_options); + } let options; if (typeof _options === 'string') { options = url.parse(_options); } else { - options = Object.assign({}, _options); + options = url.parse(_url); + if (_options) { + if (_options && Object.getOwnPropertySymbols(_options)[0]) { + let urlContext = _options[Object.getOwnPropertySymbols(_options)[0]]; + for (let key of Object.keys(urlContext)) { + options[key] = urlContext[key]; + } + } else { + for (let key of Object.keys(_options)) { + options[key] = _options[key]; + } + } + } } if (null == options.port) { options.port = 443; @@ -35,15 +58,35 @@ if (!https.request[patchMarker]) { * Ref: https://github.com/nodejs/node/commit/5118f31 */ https.get = function (_url, _options, cb) { - let options; - if (typeof _url === 'string' && _options && typeof _options !== 'function') { - options = Object.assign({}, url.parse(_url), _options); - } else if (!_options && !cb) { - options = _url; - } else if (!cb) { - options = _url; - cb = _options; + // Support for both + // https.get(options[, callback]) + // https.get(url[, options][, callback]) + if (typeof _url !== 'string' && !cb) { + cb = _options; + _options = _url; + _url = undefined; + } + if (!_url && _options) { + _url = url.format(_options); + } + let options; + if (typeof _options === 'string') { + options = url.parse(_options); + } else { + options = url.parse(_url); + if (_options) { + if (_options && Object.getOwnPropertySymbols(_options)[0]) { + let urlContext = _options[Object.getOwnPropertySymbols(_options)[0]]; + for (let key of Object.keys(urlContext)) { + options[key] = urlContext[key]; + } + } else { + for (let key of Object.keys(_options)) { + options[key] = _options[key]; + } + } } + } const req = https.request(options, cb); req.end();