diff --git a/lib/_http_client.js b/lib/_http_client.js index daa37ef064e3fc..200a08e5d5bf85 100644 --- a/lib/_http_client.js +++ b/lib/_http_client.js @@ -21,6 +21,8 @@ function ClientRequest(options, cb) { if (typeof options === 'string') { options = url.parse(options); + } else { + options = util._extend({}, options); } var agent = options.agent; diff --git a/test/parallel/test-http-request-dont-override-options.js b/test/parallel/test-http-request-dont-override-options.js new file mode 100644 index 00000000000000..66d82caeac930d --- /dev/null +++ b/test/parallel/test-http-request-dont-override-options.js @@ -0,0 +1,45 @@ +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const http = require('http'); + +var requests = 0; + +http.createServer(function(req, res) { + res.writeHead(200); + res.end('ok'); + + requests++; +}).listen(common.PORT).unref(); + +var agent = new http.Agent(); +agent.defaultPort = common.PORT; + +// options marked as explicitly undefined for readability +// in this test, they should STAY undefined as options should not +// be mutable / modified +var options = { + host: undefined, + hostname: common.localhostIPv4, + port: undefined, + defaultPort: undefined, + path: undefined, + method: undefined, + agent: agent +}; + +http.request(options, function(res) { + res.resume(); +}).end(); + +process.on('exit', function() { + assert.equal(requests, 1); + + assert.strictEqual(options.host, undefined); + assert.strictEqual(options.hostname, common.localhostIPv4); + assert.strictEqual(options.port, undefined); + assert.strictEqual(options.defaultPort, undefined); + assert.strictEqual(options.path, undefined); + assert.strictEqual(options.method, undefined); +});