mirror of https://github.com/nodejs/node.git
url: support `path` for url.format
this adds support for a "path" field that overrides "query", "search", and "pathname" if given. Fixes: https://github.com/joyent/node/issues/8722 PR-URL: https://github.com/joyent/node/pull/8755 Reviewed-by: Chris Dickinson <christopher.s.dickinson@gmail.com>pull/124/head^2
parent
c131c1f920
commit
d312b6d15c
|
@ -95,11 +95,12 @@ Take a parsed URL object, and return a formatted URL string.
|
||||||
* `hostname` will only be used if `host` is absent.
|
* `hostname` will only be used if `host` is absent.
|
||||||
* `port` will only be used if `host` is absent.
|
* `port` will only be used if `host` is absent.
|
||||||
* `host` will be used in place of `hostname` and `port`
|
* `host` will be used in place of `hostname` and `port`
|
||||||
* `pathname` is treated the same with or without the leading `/` (slash)
|
* `pathname` is treated the same with or without the leading `/` (slash).
|
||||||
* `search` will be used in place of `query`
|
* `path` is treated the same with `pathname` but able to contain `query` as well.
|
||||||
|
* `search` will be used in place of `query`.
|
||||||
* `query` (object; see `querystring`) will only be used if `search` is absent.
|
* `query` (object; see `querystring`) will only be used if `search` is absent.
|
||||||
* `search` is treated the same with or without the leading `?` (question mark)
|
* `search` is treated the same with or without the leading `?` (question mark).
|
||||||
* `hash` is treated the same with or without the leading `#` (pound sign, anchor)
|
* `hash` is treated the same with or without the leading `#` (pound sign, anchor).
|
||||||
|
|
||||||
## url.resolve(from, to)
|
## url.resolve(from, to)
|
||||||
|
|
||||||
|
|
31
lib/url.js
31
lib/url.js
|
@ -360,7 +360,7 @@ Url.prototype.parse = function(url, parseQueryString, slashesDenoteHost) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// finally, reconstruct the href based on what has been validated.
|
// finally, reconstruct the href based on what has been validated.
|
||||||
this.href = this.format();
|
this.href = this.format(parseQueryString);
|
||||||
return this;
|
return this;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -375,7 +375,7 @@ function urlFormat(obj) {
|
||||||
return obj.format();
|
return obj.format();
|
||||||
}
|
}
|
||||||
|
|
||||||
Url.prototype.format = function() {
|
Url.prototype.format = function(parseQueryString) {
|
||||||
var auth = this.auth || '';
|
var auth = this.auth || '';
|
||||||
if (auth) {
|
if (auth) {
|
||||||
auth = encodeURIComponent(auth);
|
auth = encodeURIComponent(auth);
|
||||||
|
@ -387,7 +387,26 @@ Url.prototype.format = function() {
|
||||||
pathname = this.pathname || '',
|
pathname = this.pathname || '',
|
||||||
hash = this.hash || '',
|
hash = this.hash || '',
|
||||||
host = false,
|
host = false,
|
||||||
query = '';
|
query = '',
|
||||||
|
search = '';
|
||||||
|
|
||||||
|
if (this.path) {
|
||||||
|
var qm = this.path.indexOf('?');
|
||||||
|
if (qm !== -1) {
|
||||||
|
query = this.path.slice(qm + 1);
|
||||||
|
search = '?' + query;
|
||||||
|
pathname = this.path.slice(0, qm);
|
||||||
|
} else {
|
||||||
|
if (parseQueryString) {
|
||||||
|
this.query = {};
|
||||||
|
this.search = '';
|
||||||
|
} else {
|
||||||
|
this.query = null;
|
||||||
|
this.search = null;
|
||||||
|
}
|
||||||
|
pathname = this.path;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (this.host) {
|
if (this.host) {
|
||||||
host = auth + this.host;
|
host = auth + this.host;
|
||||||
|
@ -400,13 +419,15 @@ Url.prototype.format = function() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.query &&
|
if (!query &&
|
||||||
|
this.query &&
|
||||||
util.isObject(this.query) &&
|
util.isObject(this.query) &&
|
||||||
Object.keys(this.query).length) {
|
Object.keys(this.query).length) {
|
||||||
query = querystring.stringify(this.query);
|
query = querystring.stringify(this.query);
|
||||||
}
|
}
|
||||||
|
|
||||||
var search = this.search || (query && ('?' + query)) || '';
|
if (!search)
|
||||||
|
search = this.search || (query && ('?' + query)) || '';
|
||||||
|
|
||||||
if (protocol && protocol.substr(-1) !== ':') protocol += ':';
|
if (protocol && protocol.substr(-1) !== ':') protocol += ':';
|
||||||
|
|
||||||
|
|
|
@ -1085,7 +1085,7 @@ var formatTests = {
|
||||||
|
|
||||||
// `#`,`?` in path
|
// `#`,`?` in path
|
||||||
'/path/to/%%23%3F+=&.txt?foo=theA1#bar' : {
|
'/path/to/%%23%3F+=&.txt?foo=theA1#bar' : {
|
||||||
href : '/path/to/%%23%3F+=&.txt?foo=theA1#bar',
|
href: '/path/to/%%23%3F+=&.txt?foo=theA1#bar',
|
||||||
pathname: '/path/to/%#?+=&.txt',
|
pathname: '/path/to/%#?+=&.txt',
|
||||||
query: {
|
query: {
|
||||||
foo: 'theA1'
|
foo: 'theA1'
|
||||||
|
@ -1095,7 +1095,7 @@ var formatTests = {
|
||||||
|
|
||||||
// `#`,`?` in path + `#` in query
|
// `#`,`?` in path + `#` in query
|
||||||
'/path/to/%%23%3F+=&.txt?foo=the%231#bar' : {
|
'/path/to/%%23%3F+=&.txt?foo=the%231#bar' : {
|
||||||
href : '/path/to/%%23%3F+=&.txt?foo=the%231#bar',
|
href: '/path/to/%%23%3F+=&.txt?foo=the%231#bar',
|
||||||
pathname: '/path/to/%#?+=&.txt',
|
pathname: '/path/to/%#?+=&.txt',
|
||||||
query: {
|
query: {
|
||||||
foo: 'the#1'
|
foo: 'the#1'
|
||||||
|
@ -1110,7 +1110,7 @@ var formatTests = {
|
||||||
hostname: 'ex.com',
|
hostname: 'ex.com',
|
||||||
hash: '#frag',
|
hash: '#frag',
|
||||||
search: '?abc=the#1?&foo=bar',
|
search: '?abc=the#1?&foo=bar',
|
||||||
pathname: '/foo?100%m#r',
|
pathname: '/foo?100%m#r'
|
||||||
},
|
},
|
||||||
|
|
||||||
// `?` and `#` in search only
|
// `?` and `#` in search only
|
||||||
|
@ -1120,8 +1120,77 @@ var formatTests = {
|
||||||
hostname: 'ex.com',
|
hostname: 'ex.com',
|
||||||
hash: '#frag',
|
hash: '#frag',
|
||||||
search: '?abc=the#1?&foo=bar',
|
search: '?abc=the#1?&foo=bar',
|
||||||
pathname: '/fooA100%mBr',
|
pathname: '/fooA100%mBr'
|
||||||
|
},
|
||||||
|
|
||||||
|
// path
|
||||||
|
'http://github.com/joyent/node#js1': {
|
||||||
|
href: 'http://github.com/joyent/node#js1',
|
||||||
|
protocol: 'http:',
|
||||||
|
hostname: 'github.com',
|
||||||
|
hash: '#js1',
|
||||||
|
path: '/joyent/node'
|
||||||
|
},
|
||||||
|
|
||||||
|
// pathname vs. path, path wins
|
||||||
|
'http://github.com/joyent/node2#js1': {
|
||||||
|
href: 'http://github.com/joyent/node2#js1',
|
||||||
|
protocol: 'http:',
|
||||||
|
hostname: 'github.com',
|
||||||
|
hash: '#js1',
|
||||||
|
path: '/joyent/node2',
|
||||||
|
pathname: '/joyent/node'
|
||||||
|
},
|
||||||
|
|
||||||
|
// pathname with query/search
|
||||||
|
'http://github.com/joyent/node?foo=bar#js2': {
|
||||||
|
href: 'http://github.com/joyent/node?foo=bar#js2',
|
||||||
|
protocol: 'http:',
|
||||||
|
hostname: 'github.com',
|
||||||
|
hash: '#js2',
|
||||||
|
path: '/joyent/node?foo=bar'
|
||||||
|
},
|
||||||
|
|
||||||
|
// path vs. query, path wins
|
||||||
|
'http://github.com/joyent/node?foo=bar2#js3': {
|
||||||
|
href: 'http://github.com/joyent/node?foo=bar2#js3',
|
||||||
|
protocol: 'http:',
|
||||||
|
hostname: 'github.com',
|
||||||
|
hash: '#js3',
|
||||||
|
path: '/joyent/node?foo=bar2',
|
||||||
|
query: {foo: 'bar'}
|
||||||
|
},
|
||||||
|
|
||||||
|
// path vs. search, path wins
|
||||||
|
'http://github.com/joyent/node?foo=bar3#js4': {
|
||||||
|
href: 'http://github.com/joyent/node?foo=bar3#js4',
|
||||||
|
protocol: 'http:',
|
||||||
|
hostname: 'github.com',
|
||||||
|
hash: '#js4',
|
||||||
|
path: '/joyent/node?foo=bar3',
|
||||||
|
search: '?foo=bar'
|
||||||
|
},
|
||||||
|
|
||||||
|
// path is present without ? vs. query given
|
||||||
|
'http://github.com/joyent/node#js5': {
|
||||||
|
href: 'http://github.com/joyent/node#js5',
|
||||||
|
protocol: 'http:',
|
||||||
|
hostname: 'github.com',
|
||||||
|
hash: '#js5',
|
||||||
|
path: '/joyent/node',
|
||||||
|
query: {foo: 'bar'}
|
||||||
|
},
|
||||||
|
|
||||||
|
// path is present without ? vs. search given
|
||||||
|
'http://github.com/joyent/node#js6': {
|
||||||
|
href: 'http://github.com/joyent/node#js6',
|
||||||
|
protocol: 'http:',
|
||||||
|
hostname: 'github.com',
|
||||||
|
hash: '#js6',
|
||||||
|
path: '/joyent/node',
|
||||||
|
search: '?foo=bar'
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
for (var u in formatTests) {
|
for (var u in formatTests) {
|
||||||
var expect = formatTests[u].href;
|
var expect = formatTests[u].href;
|
||||||
|
|
Loading…
Reference in New Issue