From 58a1d7ec30a5e26625f42c97c3cbe9134368605d Mon Sep 17 00:00:00 2001 From: Ryan Petrello Date: Fri, 20 May 2011 00:50:35 -0400 Subject: [PATCH] Close #562 Close #1078 Parse file:// urls properly The file:// protocol *always* has a hostname; it's frequently abbreviated as an empty string, which represents 'localhost' implicitly. According to RFC 1738 (http://tools.ietf.org/html/rfc1738): A file URL takes the form: file:/// where is the fully qualified domain name of the system on which the is accessible... As a special case, can be the string "localhost" or the empty string; this is interpreted as 'the machine from which the URL is being interpreted'. --- lib/url.js | 4 +--- test/simple/test-url.js | 30 ++++++++++++++++++++++++++++-- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/lib/url.js b/lib/url.js index 21d3acb348e..8b01c8548f5 100644 --- a/lib/url.js +++ b/lib/url.js @@ -54,9 +54,7 @@ var protocolPattern = /^([a-z0-9]+:)/i, // protocols that never have a hostname. hostlessProtocol = { 'javascript': true, - 'javascript:': true, - 'file': true, - 'file:': true + 'javascript:': true }, // protocols that always have a path component. pathedProtocol = { diff --git a/test/simple/test-url.js b/test/simple/test-url.js index 954454ffa8a..ea85bc967fe 100644 --- a/test/simple/test-url.js +++ b/test/simple/test-url.js @@ -166,12 +166,38 @@ var parseTests = { 'file:///etc/passwd' : { 'href': 'file:///etc/passwd', 'protocol': 'file:', - 'pathname': '///etc/passwd' + 'pathname': '/etc/passwd', + 'hostname': '' + }, + 'file://localhost/etc/passwd' : { + 'href': 'file://localhost/etc/passwd', + 'protocol': 'file:', + 'pathname': '/etc/passwd', + 'hostname': 'localhost' + }, + 'file://foo/etc/passwd' : { + 'href': 'file://foo/etc/passwd', + 'protocol': 'file:', + 'pathname': '/etc/passwd', + 'hostname': 'foo' }, 'file:///etc/node/' : { 'href': 'file:///etc/node/', 'protocol': 'file:', - 'pathname': '///etc/node/' + 'pathname': '/etc/node/', + 'hostname': '' + }, + 'file://localhost/etc/node/' : { + 'href': 'file://localhost/etc/node/', + 'protocol': 'file:', + 'pathname': '/etc/node/', + 'hostname': 'localhost' + }, + 'file://foo/etc/node/' : { + 'href': 'file://foo/etc/node/', + 'protocol': 'file:', + 'pathname': '/etc/node/', + 'hostname': 'foo' }, 'http:/baz/../foo/bar' : { 'href': 'http:/baz/../foo/bar',