url: allow use of URL with http.request and https.request
PR-URL: https://github.com/nodejs/node/pull/10638 Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Evan Lucas <evanlucas@me.com> Reviewed-By: Michal Zasso <targos@protonmail.com> Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com>
This commit is contained in:
parent
fd115862f4
commit
0f62ee6963
@ -13,7 +13,7 @@ const debug = common.debug;
|
|||||||
const OutgoingMessage = require('_http_outgoing').OutgoingMessage;
|
const OutgoingMessage = require('_http_outgoing').OutgoingMessage;
|
||||||
const Agent = require('_http_agent');
|
const Agent = require('_http_agent');
|
||||||
const Buffer = require('buffer').Buffer;
|
const Buffer = require('buffer').Buffer;
|
||||||
|
const urlToOptions = require('internal/url').urlToOptions;
|
||||||
|
|
||||||
function ClientRequest(options, cb) {
|
function ClientRequest(options, cb) {
|
||||||
var self = this;
|
var self = this;
|
||||||
@ -24,6 +24,8 @@ function ClientRequest(options, cb) {
|
|||||||
if (!options.hostname) {
|
if (!options.hostname) {
|
||||||
throw new Error('Unable to determine the domain name');
|
throw new Error('Unable to determine the domain name');
|
||||||
}
|
}
|
||||||
|
} else if (options instanceof url.URL) {
|
||||||
|
options = urlToOptions(options);
|
||||||
} else {
|
} else {
|
||||||
options = util._extend({}, options);
|
options = util._extend({}, options);
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,7 @@ const http = require('http');
|
|||||||
const util = require('util');
|
const util = require('util');
|
||||||
const inherits = util.inherits;
|
const inherits = util.inherits;
|
||||||
const debug = util.debuglog('https');
|
const debug = util.debuglog('https');
|
||||||
|
const urlToOptions = require('internal/url').urlToOptions;
|
||||||
|
|
||||||
function Server(opts, requestListener) {
|
function Server(opts, requestListener) {
|
||||||
if (!(this instanceof Server)) return new Server(opts, requestListener);
|
if (!(this instanceof Server)) return new Server(opts, requestListener);
|
||||||
@ -192,6 +193,8 @@ exports.request = function request(options, cb) {
|
|||||||
if (!options.hostname) {
|
if (!options.hostname) {
|
||||||
throw new Error('Unable to determine the domain name');
|
throw new Error('Unable to determine the domain name');
|
||||||
}
|
}
|
||||||
|
} else if (options instanceof url.URL) {
|
||||||
|
options = urlToOptions(options);
|
||||||
} else {
|
} else {
|
||||||
options = util._extend({}, options);
|
options = util._extend({}, options);
|
||||||
}
|
}
|
||||||
|
@ -909,8 +909,32 @@ function domainToUnicode(domain) {
|
|||||||
return binding.domainToUnicode(String(domain));
|
return binding.domainToUnicode(String(domain));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Utility function that converts a URL object into an ordinary
|
||||||
|
// options object as expected by the http.request and https.request
|
||||||
|
// APIs.
|
||||||
|
function urlToOptions(url) {
|
||||||
|
var options = {
|
||||||
|
protocol: url.protocol,
|
||||||
|
host: url.host,
|
||||||
|
hostname: url.hostname,
|
||||||
|
hash: url.hash,
|
||||||
|
search: url.search,
|
||||||
|
pathname: url.pathname,
|
||||||
|
path: `${url.pathname}${url.search}`,
|
||||||
|
href: url.href
|
||||||
|
};
|
||||||
|
if (url.port !== '') {
|
||||||
|
options.port = Number(url.port);
|
||||||
|
}
|
||||||
|
if (url.username || url.password) {
|
||||||
|
options.auth = `${url.username}:${url.password}`;
|
||||||
|
}
|
||||||
|
return options;
|
||||||
|
}
|
||||||
|
|
||||||
exports.URL = URL;
|
exports.URL = URL;
|
||||||
exports.originFor = originFor;
|
exports.originFor = originFor;
|
||||||
exports.domainToASCII = domainToASCII;
|
exports.domainToASCII = domainToASCII;
|
||||||
exports.domainToUnicode = domainToUnicode;
|
exports.domainToUnicode = domainToUnicode;
|
||||||
exports.encodeAuth = encodeAuth;
|
exports.encodeAuth = encodeAuth;
|
||||||
|
exports.urlToOptions = urlToOptions;
|
||||||
|
@ -2,6 +2,8 @@
|
|||||||
const common = require('../common');
|
const common = require('../common');
|
||||||
const assert = require('assert');
|
const assert = require('assert');
|
||||||
const http = require('http');
|
const http = require('http');
|
||||||
|
const url = require('url');
|
||||||
|
const URL = url.URL;
|
||||||
|
|
||||||
var server = http.createServer(common.mustCall(function(req, res) {
|
var server = http.createServer(common.mustCall(function(req, res) {
|
||||||
assert.equal('GET', req.method);
|
assert.equal('GET', req.method);
|
||||||
@ -10,8 +12,11 @@ var server = http.createServer(common.mustCall(function(req, res) {
|
|||||||
res.write('hello\n');
|
res.write('hello\n');
|
||||||
res.end();
|
res.end();
|
||||||
server.close();
|
server.close();
|
||||||
}));
|
}, 3));
|
||||||
|
|
||||||
server.listen(0, function() {
|
server.listen(0, function() {
|
||||||
http.get(`http://127.0.0.1:${this.address().port}/foo?bar`);
|
const u = `http://127.0.0.1:${this.address().port}/foo?bar`;
|
||||||
|
http.get(u);
|
||||||
|
http.get(url.parse(u));
|
||||||
|
http.get(new URL(u));
|
||||||
});
|
});
|
||||||
|
@ -12,6 +12,8 @@ if (!common.hasCrypto) {
|
|||||||
const https = require('https');
|
const https = require('https');
|
||||||
|
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
|
const url = require('url');
|
||||||
|
const URL = url.URL;
|
||||||
|
|
||||||
var options = {
|
var options = {
|
||||||
key: fs.readFileSync(common.fixturesDir + '/keys/agent1-key.pem'),
|
key: fs.readFileSync(common.fixturesDir + '/keys/agent1-key.pem'),
|
||||||
@ -25,8 +27,11 @@ var server = https.createServer(options, common.mustCall(function(req, res) {
|
|||||||
res.write('hello\n');
|
res.write('hello\n');
|
||||||
res.end();
|
res.end();
|
||||||
server.close();
|
server.close();
|
||||||
}));
|
}, 3));
|
||||||
|
|
||||||
server.listen(0, function() {
|
server.listen(0, function() {
|
||||||
https.get(`https://127.0.0.1:${this.address().port}/foo?bar`);
|
const u = `https://127.0.0.1:${this.address().port}/foo?bar`;
|
||||||
|
https.get(u);
|
||||||
|
https.get(url.parse(u));
|
||||||
|
https.get(new URL(u));
|
||||||
});
|
});
|
||||||
|
@ -1,9 +1,11 @@
|
|||||||
|
// Flags: --expose-internals
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
require('../common');
|
require('../common');
|
||||||
|
|
||||||
const URL = require('url').URL;
|
const URL = require('url').URL;
|
||||||
const assert = require('assert');
|
const assert = require('assert');
|
||||||
|
const urlToOptions = require('internal/url').urlToOptions;
|
||||||
|
|
||||||
const url = new URL('http://user:pass@foo.bar.com:21/aaa/zzz?l=24#test');
|
const url = new URL('http://user:pass@foo.bar.com:21/aaa/zzz?l=24#test');
|
||||||
const oldParams = url.searchParams; // for test of [SameObject]
|
const oldParams = url.searchParams; // for test of [SameObject]
|
||||||
@ -125,3 +127,18 @@ assert.strictEqual(url.toString(),
|
|||||||
'https://user2:pass2@foo.bar.org:23/aaa/bbb?k=99#abcd');
|
'https://user2:pass2@foo.bar.org:23/aaa/bbb?k=99#abcd');
|
||||||
assert.strictEqual((delete url.searchParams), true);
|
assert.strictEqual((delete url.searchParams), true);
|
||||||
assert.strictEqual(url.searchParams, oldParams);
|
assert.strictEqual(url.searchParams, oldParams);
|
||||||
|
|
||||||
|
// Test urlToOptions
|
||||||
|
{
|
||||||
|
const opts =
|
||||||
|
urlToOptions(new URL('http://user:pass@foo.bar.com:21/aaa/zzz?l=24#test'));
|
||||||
|
assert.strictEqual(opts instanceof URL, false);
|
||||||
|
assert.strictEqual(opts.protocol, 'http:');
|
||||||
|
assert.strictEqual(opts.auth, 'user:pass');
|
||||||
|
assert.strictEqual(opts.hostname, 'foo.bar.com');
|
||||||
|
assert.strictEqual(opts.port, 21);
|
||||||
|
assert.strictEqual(opts.path, '/aaa/zzz?l=24');
|
||||||
|
assert.strictEqual(opts.pathname, '/aaa/zzz');
|
||||||
|
assert.strictEqual(opts.search, '?l=24');
|
||||||
|
assert.strictEqual(opts.hash, '#test');
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user