diff options
author | seebees <seebees@gmail.com> | 2011-09-13 13:55:18 -0700 |
---|---|---|
committer | koichik <koichik@improvement.jp> | 2011-10-22 14:14:39 +0900 |
commit | be4576de7abd0e109331ccf83c8b1ea71f1910b9 (patch) | |
tree | 3e2c3295c33bbfca138c349023d79237b09c0cdd /lib/url.js | |
parent | ed744ecbfd783a8b6eca46fd4f64013b3ae7bad0 (diff) | |
download | android-node-v8-be4576de7abd0e109331ccf83c8b1ea71f1910b9.tar.gz android-node-v8-be4576de7abd0e109331ccf83c8b1ea71f1910b9.tar.bz2 android-node-v8-be4576de7abd0e109331ccf83c8b1ea71f1910b9.zip |
url.resolveObject(url.parse(x), y) == url.parse(url.resolve(x, y));
added a .path property = .pathname + .search for use with http.request
And tests to verify everything.
With the tests, I changed over to deepEqual, and I would note the comment on the test
['.//g', 'f:/a', 'f://g'], which I think is a fundamental problem
This supersedes pull 1596
Diffstat (limited to 'lib/url.js')
-rw-r--r-- | lib/url.js | 89 |
1 files changed, 75 insertions, 14 deletions
diff --git a/lib/url.js b/lib/url.js index fdf434c6c3..e6915b42c5 100644 --- a/lib/url.js +++ b/lib/url.js @@ -295,9 +295,14 @@ function urlParse(url, parseQueryString, slashesDenoteHost) { out.pathname = '/'; } + //to support http.request + if (out.pathname || out.search) { + out.path = (out.pathname ? out.pathname : '') + + (out.search ? out.search : ''); + } + // finally, reconstruct the href based on what has been validated. out.href = urlFormat(out); - return out; } @@ -366,11 +371,20 @@ function urlResolveObject(source, relative) { // hash is always overridden, no matter what. source.hash = relative.hash; - if (relative.href === '') return source; + if (relative.href === '') { + source.href = urlFormat(source); + return source; + } // hrefs like //foo/bar always cut to the protocol. if (relative.slashes && !relative.protocol) { relative.protocol = source.protocol; + //urlParse appends trailing / to urls like http://www.example.com + if (slashedProtocol[relative.protocol] && + relative.hostname && !relative.pathname) { + relative.path = relative.pathname = '/'; + } + relative.href = urlFormat(relative); return relative; } @@ -383,14 +397,16 @@ function urlResolveObject(source, relative) { // if it is file:, then the host is dropped, // because that's known to be hostless. // anything else is assumed to be absolute. - - if (!slashedProtocol[relative.protocol]) return relative; - + if (!slashedProtocol[relative.protocol]) { + relative.href = urlFormat(relative); + return relative; + } source.protocol = relative.protocol; if (!relative.host && !hostlessProtocol[relative.protocol]) { var relPath = (relative.pathname || '').split('/'); while (relPath.length && !(relative.host = relPath.shift())); if (!relative.host) relative.host = ''; + if (!relative.hostname) relative.hostname = ''; if (relPath[0] !== '') relPath.unshift(''); if (relPath.length < 2) relPath.unshift(''); relative.pathname = relPath.join('/'); @@ -399,9 +415,16 @@ function urlResolveObject(source, relative) { source.search = relative.search; source.query = relative.query; source.host = relative.host || ''; - delete source.auth; - delete source.hostname; + source.auth = relative.auth; + source.hostname = relative.hostname || relative.host; source.port = relative.port; + //to support http.request + if (source.pathname !== undefined || source.search !== undefined) { + source.path = (source.pathname ? source.pathname : '') + + (source.search ? source.search : ''); + } + source.slashes = source.slashes || relative.slashes; + source.href = urlFormat(source); return source; } @@ -416,8 +439,7 @@ function urlResolveObject(source, relative) { srcPath = source.pathname && source.pathname.split('/') || [], relPath = relative.pathname && relative.pathname.split('/') || [], psychotic = source.protocol && - !slashedProtocol[source.protocol] && - source.host !== undefined; + !slashedProtocol[source.protocol]; // if the url is a non-slashed url, then relative // links like ../.. should be able @@ -452,6 +474,8 @@ function urlResolveObject(source, relative) { // it's absolute. source.host = (relative.host || relative.host === '') ? relative.host : source.host; + source.hostname = (relative.hostname || relative.hostname === '') ? + relative.hostname : source.hostname; source.search = relative.search; source.query = relative.query; srcPath = relPath; @@ -469,19 +493,40 @@ function urlResolveObject(source, relative) { // like href='?foo'. // Put this after the other two cases because it simplifies the booleans if (psychotic) { - source.host = srcPath.shift(); + source.hostname = source.host = srcPath.shift(); + //occationaly the auth can get stuck only in host + //this especialy happens in cases like + //url.resolveObject('mailto:local1@domain1', 'local2@domain2') + var authInHost = source.host && source.host.indexOf('@') > 0 ? + source.host.split('@') : false; + if (authInHost) { + source.auth = authInHost.shift(); + source.hostname = authInHost.shift(); + } } source.search = relative.search; source.query = relative.query; + //to support http.request + if (source.pathname !== undefined || source.search !== undefined) { + source.path = (source.pathname ? source.pathname : '') + + (source.search ? source.search : ''); + } + source.href = urlFormat(source); return source; } if (!srcPath.length) { // no path at all. easy. // we've already handled the other stuff above. delete source.pathname; + //to support http.request + if (!source.search) { + source.path = '/' + source.search; + } else { + delete source.path; + } + source.href = urlFormat(source); return source; } - // if a url ENDs in . or .., then it must get a trailing slash. // however, if it ends in anything else non-slashy, // then it must NOT get a trailing slash. @@ -527,7 +572,17 @@ function urlResolveObject(source, relative) { // put the host back if (psychotic) { - source.host = isAbsolute ? '' : srcPath.shift(); + source.hostname = source.host = isAbsolute ? '' : + srcPath.length ? srcPath.shift() : ''; + //occationaly the auth can get stuck only in host + //this especialy happens in cases like + //url.resolveObject('mailto:local1@domain1', 'local2@domain2') + var authInHost = source.host && source.host.indexOf('@') > 0 ? + source.host.split('@') : false; + if (authInHost) { + relative.auth = authInHost.shift(); + source.hostname = authInHost.shift(); + } } mustEndAbs = mustEndAbs || (source.host && srcPath.length); @@ -537,8 +592,14 @@ function urlResolveObject(source, relative) { } source.pathname = srcPath.join('/'); - - + //to support request.http + if (source.pathname !== undefined || source.search !== undefined) { + source.path = (source.pathname ? source.pathname : '') + + (source.search ? source.search : ''); + } + source.auth = relative.auth; + source.slashes = source.slashes || relative.slashes; + source.href = urlFormat(source); return source; } |