Browse Source

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.
v0.7.4-release
isaacs 15 years ago
committed by Ryan Dahl
parent
commit
0e311717b5
  1. 19
      lib/url.js
  2. 4
      test/simple/test-url.js

19
lib/url.js

@ -18,7 +18,7 @@ var protocolPattern = /^([a-z0-9]+:)/,
path = require("path"), // internal module, guaranteed to be loaded already. path = require("path"), // internal module, guaranteed to be loaded already.
querystring = require('querystring'); querystring = require('querystring');
function urlParse (url, parseQueryString) { function urlParse (url, parseQueryString, slashesDenoteHost) {
if (url && typeof(url) === "object" && url.href) return url; if (url && typeof(url) === "object" && url.href) return url;
var out = { href : url }, var out = { href : url },
@ -32,10 +32,15 @@ function urlParse (url, parseQueryString) {
} }
// figure out if it's got a host // figure out if it's got a host
var slashes = rest.substr(0, 2) === "//"; // user@server is *always* interpreted as a hostname, and url
if (slashes && !(proto && hostlessProtocol[proto])) { // resolution will treat //foo/bar as host=foo,path=bar because that's
rest = rest.substr(2); // how the browser resolves relative URLs.
out.slashes = true; 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]))) { if (!hostlessProtocol[proto] && (slashes || (proto && !slashedProtocol[proto]))) {
// there's a hostname. // there's a hostname.
@ -133,8 +138,8 @@ function urlResolve (source, relative) {
function urlResolveObject (source, relative) { function urlResolveObject (source, relative) {
if (!source) return relative; if (!source) return relative;
source = urlParse(urlFormat(source)); source = urlParse(urlFormat(source), false, true);
relative = urlParse(urlFormat(relative)); relative = urlParse(urlFormat(relative), false, true);
// hash is always overridden, no matter what. // hash is always overridden, no matter what.
source.hash = relative.hash; source.hash = relative.hash;

4
test/simple/test-url.js

@ -7,6 +7,10 @@ var url = require("url"),
// URLs to parse, and expected data // URLs to parse, and expected data
// { url : parsed } // { url : parsed }
var parseTests = { var parseTests = {
"//some_path" : {
"href": "//some_path",
"pathname": "//some_path"
},
"http://www.narwhaljs.org/blog/categories?id=news" : { "http://www.narwhaljs.org/blog/categories?id=news" : {
"href": "http://www.narwhaljs.org/blog/categories?id=news", "href": "http://www.narwhaljs.org/blog/categories?id=news",
"protocol": "http:", "protocol": "http:",

Loading…
Cancel
Save