summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSenthil Kumaran <senthil@uthcode.com>2014-09-22 07:49:16 (GMT)
committerSenthil Kumaran <senthil@uthcode.com>2014-09-22 07:49:16 (GMT)
commita66e3885fb7bafbe69d738f500a63bd6718b0076 (patch)
tree08fa3d6c998549cd24da7694eb9df1d06cf21129
parente6c27c9f6b381f1970e8639d298e87446dbf1a61 (diff)
downloadcpython-a66e3885fb7bafbe69d738f500a63bd6718b0076.zip
cpython-a66e3885fb7bafbe69d738f500a63bd6718b0076.tar.gz
cpython-a66e3885fb7bafbe69d738f500a63bd6718b0076.tar.bz2
Issue #22278: Fix urljoin problem with relative urls, a regression observed
after changes to issue22118 were submitted. Patch contributed by Demian Brecht and reviewed by Antoine Pitrou.
-rw-r--r--Lib/test/test_urlparse.py12
-rw-r--r--Lib/urllib/parse.py6
-rw-r--r--Misc/NEWS3
3 files changed, 20 insertions, 1 deletions
diff --git a/Lib/test/test_urlparse.py b/Lib/test/test_urlparse.py
index 24c1856..cb323d3 100644
--- a/Lib/test/test_urlparse.py
+++ b/Lib/test/test_urlparse.py
@@ -380,6 +380,18 @@ class UrlParseTestCase(unittest.TestCase):
# self.checkJoin(SIMPLE_BASE, '../../../g','http://a/../g')
# self.checkJoin(SIMPLE_BASE, '/./g','http://a/./g')
+ # test for issue22118 duplicate slashes
+ self.checkJoin(SIMPLE_BASE + '/', 'foo', SIMPLE_BASE + '/foo')
+
+ # Non-RFC-defined tests, covering variations of base and trailing
+ # slashes
+ self.checkJoin('http://a/b/c/d/e/', '../../f/g/', 'http://a/b/c/f/g/')
+ self.checkJoin('http://a/b/c/d/e', '../../f/g/', 'http://a/b/f/g/')
+ self.checkJoin('http://a/b/c/d/e/', '/../../f/g/', 'http://a/f/g/')
+ self.checkJoin('http://a/b/c/d/e', '/../../f/g/', 'http://a/f/g/')
+ self.checkJoin('http://a/b/c/d/e/', '../../f/g', 'http://a/b/c/f/g')
+ self.checkJoin('http://a/b/', '../../f/g/', 'http://a/f/g/')
+
def test_RFC2732(self):
str_cases = [
('http://Test.python.org:5432/foo/', 'test.python.org', 5432),
diff --git a/Lib/urllib/parse.py b/Lib/urllib/parse.py
index b6ac414..8bbeab6 100644
--- a/Lib/urllib/parse.py
+++ b/Lib/urllib/parse.py
@@ -443,6 +443,10 @@ def urljoin(base, url, allow_fragments=True):
segments = path.split('/')
else:
segments = base_parts + path.split('/')
+ # filter out elements that would cause redundant slashes on re-joining
+ # the resolved_path
+ segments = segments[0:1] + [
+ s for s in segments[1:-1] if len(s) > 0] + segments[-1:]
resolved_path = []
@@ -465,7 +469,7 @@ def urljoin(base, url, allow_fragments=True):
resolved_path.append('')
return _coerce_result(urlunparse((scheme, netloc, '/'.join(
- resolved_path), params, query, fragment)))
+ resolved_path) or '/', params, query, fragment)))
def urldefrag(url):
diff --git a/Misc/NEWS b/Misc/NEWS
index 7240842..c26eaa6 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -137,6 +137,9 @@ Core and Builtins
Library
-------
+- Issue #22278: Fix urljoin problem with relative urls, a regression observed
+ after changes to issue22118 were submitted.
+
- Issue #22415: Fixed debugging output of the GROUPREF_EXISTS opcode in the re
module. Removed trailing spaces in debugging output.