From 0e311717b5bbec7f3fbf0b06592bfa19cc11becc Mon Sep 17 00:00:00 2001 From: isaacs Date: Tue, 31 Aug 2010 17:59:50 -0700 Subject: [PATCH] Treat "//some_path" as pathname rather than hostname by default. Note that "//" is still a special indicator for the hostname, and this does not change the parsing of mailto: and other "slashless" url schemes. It does however remove some oddness in url.parse(req.url) which is the most common use-case for the url.parse function. --- lib/url.js | 19 ++++++++++++------- test/simple/test-url.js | 4 ++++ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/lib/url.js b/lib/url.js index c4b534a5d5..45dea833b2 100644 --- a/lib/url.js +++ b/lib/url.js @@ -18,7 +18,7 @@ var protocolPattern = /^([a-z0-9]+:)/, path = require("path"), // internal module, guaranteed to be loaded already. querystring = require('querystring'); -function urlParse (url, parseQueryString) { +function urlParse (url, parseQueryString, slashesDenoteHost) { if (url && typeof(url) === "object" && url.href) return url; var out = { href : url }, @@ -32,10 +32,15 @@ function urlParse (url, parseQueryString) { } // figure out if it's got a host - var slashes = rest.substr(0, 2) === "//"; - if (slashes && !(proto && hostlessProtocol[proto])) { - rest = rest.substr(2); - out.slashes = true; + // user@server is *always* interpreted as a hostname, and url + // resolution will treat //foo/bar as host=foo,path=bar because that's + // how the browser resolves relative URLs. + if (slashesDenoteHost || proto || rest.match(/^\/\/[^@\/]+@[^@\/]+/)) { + var slashes = rest.substr(0, 2) === "//"; + if (slashes && !(proto && hostlessProtocol[proto])) { + rest = rest.substr(2); + out.slashes = true; + } } if (!hostlessProtocol[proto] && (slashes || (proto && !slashedProtocol[proto]))) { // there's a hostname. @@ -133,8 +138,8 @@ function urlResolve (source, relative) { function urlResolveObject (source, relative) { if (!source) return relative; - source = urlParse(urlFormat(source)); - relative = urlParse(urlFormat(relative)); + source = urlParse(urlFormat(source), false, true); + relative = urlParse(urlFormat(relative), false, true); // hash is always overridden, no matter what. source.hash = relative.hash; diff --git a/test/simple/test-url.js b/test/simple/test-url.js index f9879e4dc6..312c939b02 100644 --- a/test/simple/test-url.js +++ b/test/simple/test-url.js @@ -7,6 +7,10 @@ var url = require("url"), // URLs to parse, and expected data // { url : parsed } var parseTests = { + "//some_path" : { + "href": "//some_path", + "pathname": "//some_path" + }, "http://www.narwhaljs.org/blog/categories?id=news" : { "href": "http://www.narwhaljs.org/blog/categories?id=news", "protocol": "http:",