Skip to content

Instantly share code, notes, and snippets.

@isaacs
Created March 25, 2014 21:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save isaacs/27d1ca6fa4c53992da24 to your computer and use it in GitHub Desktop.
Save isaacs/27d1ca6fa4c53992da24 to your computer and use it in GitHub Desktop.
From 638ef37dc333d01019889db9509da8751d0fd2bd Mon Sep 17 00:00:00 2001
From: isaacs <i@izs.me>
Date: Tue, 25 Mar 2014 14:16:55 -0700
Subject: [PATCH] url: treat \ the same as /
See https://code.google.com/p/chromium/issues/detail?id=25916
Parse URLs with backslashes the same as web browsers, by replacing all
backslashes with forward slashes, except those that occur after the
first # character.
---
lib/url.js | 6 ++++++
test/simple/test-url.js | 26 ++++++++++++++++++++++++++
2 files changed, 32 insertions(+)
diff --git a/lib/url.js b/lib/url.js
index 09e9cce..c13f74b 100644
--- a/lib/url.js
+++ b/lib/url.js
@@ -107,6 +107,12 @@ Url.prototype.parse = function(url, parseQueryString, slashesDenoteHost) {
throw new TypeError("Parameter 'url' must be a string, not " + typeof url);
}
+ // Copy chrome, IE, opera backslash-handling behavior.
+ // See: https://code.google.com/p/chromium/issues/detail?id=25916
+ var hashSplit = url.split('#');
+ hashSplit[0] = hashSplit[0].replace(/\\/g, '/');
+ url = hashSplit.join('#');
+
var rest = url;
// trim before proceeding.
diff --git a/test/simple/test-url.js b/test/simple/test-url.js
index 57d0a6d..95f50a2 100644
--- a/test/simple/test-url.js
+++ b/test/simple/test-url.js
@@ -34,6 +34,28 @@ var parseTests = {
'path': '//some_path'
},
+ 'http:\\\\evil-phisher\\foo.html#h\\a\\s\\h': {
+ protocol: 'http:',
+ slashes: true,
+ host: 'evil-phisher',
+ hostname: 'evil-phisher',
+ pathname: '/foo.html',
+ path: '/foo.html',
+ hash: '#h\\a\\s\\h',
+ href: 'http://evil-phisher/foo.html#h\\a\\s\\h'
+ },
+
+
+ 'http:\\\\evil-phisher\\foo.html': {
+ protocol: 'http:',
+ slashes: true,
+ host: 'evil-phisher',
+ hostname: 'evil-phisher',
+ pathname: '/foo.html',
+ path: '/foo.html',
+ href: 'http://evil-phisher/foo.html'
+ },
+
'HTTP://www.example.com/' : {
'href': 'http://www.example.com/',
'protocol': 'http:',
@@ -1457,3 +1479,7 @@ relativeTests2.forEach(function(relativeTest) {
'format(' + relativeTest[1] + ') == ' + expected +
'\nactual:' + actual);
});
+
+// backslashes should be like forward slashes
+var res = url.resolve('http://example.com/x', '\\\\foo.com\\bar');
+assert.equal(res, 'http://foo.com/bar');
--
1.8.3.2
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment