aboutsummaryrefslogtreecommitdiff
path: root/lib/url.js
diff options
context:
space:
mode:
authorseebees <seebees@gmail.com>2011-09-13 13:55:18 -0700
committerkoichik <koichik@improvement.jp>2011-10-22 14:14:39 +0900
commitbe4576de7abd0e109331ccf83c8b1ea71f1910b9 (patch)
tree3e2c3295c33bbfca138c349023d79237b09c0cdd /lib/url.js
parented744ecbfd783a8b6eca46fd4f64013b3ae7bad0 (diff)
downloadandroid-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.js89
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;
}