Issue 1432. Fixes a bug caused because of the evolution
of the RFC that describes the behaviour. Note that we now have the same behaviour than the current browsers.
This commit is contained in:
parent
8401eec7fa
commit
67d1981c51
|
@ -6,6 +6,7 @@ import urlparse
|
||||||
|
|
||||||
RFC1808_BASE = "http://a/b/c/d;p?q#f"
|
RFC1808_BASE = "http://a/b/c/d;p?q#f"
|
||||||
RFC2396_BASE = "http://a/b/c/d;p?q"
|
RFC2396_BASE = "http://a/b/c/d;p?q"
|
||||||
|
RFC3986_BASE = "http://a/b/c/d;p?q"
|
||||||
|
|
||||||
class UrlParseTestCase(unittest.TestCase):
|
class UrlParseTestCase(unittest.TestCase):
|
||||||
|
|
||||||
|
@ -167,8 +168,6 @@ class UrlParseTestCase(unittest.TestCase):
|
||||||
def test_RFC2396(self):
|
def test_RFC2396(self):
|
||||||
# cases from RFC 2396
|
# cases from RFC 2396
|
||||||
|
|
||||||
self.checkJoin(RFC2396_BASE, '?y', 'http://a/b/c/?y')
|
|
||||||
self.checkJoin(RFC2396_BASE, ';x', 'http://a/b/c/;x')
|
|
||||||
|
|
||||||
self.checkJoin(RFC2396_BASE, 'g:h', 'g:h')
|
self.checkJoin(RFC2396_BASE, 'g:h', 'g:h')
|
||||||
self.checkJoin(RFC2396_BASE, 'g', 'http://a/b/c/g')
|
self.checkJoin(RFC2396_BASE, 'g', 'http://a/b/c/g')
|
||||||
|
@ -210,6 +209,14 @@ class UrlParseTestCase(unittest.TestCase):
|
||||||
self.checkJoin(RFC2396_BASE, 'g#s/./x', 'http://a/b/c/g#s/./x')
|
self.checkJoin(RFC2396_BASE, 'g#s/./x', 'http://a/b/c/g#s/./x')
|
||||||
self.checkJoin(RFC2396_BASE, 'g#s/../x', 'http://a/b/c/g#s/../x')
|
self.checkJoin(RFC2396_BASE, 'g#s/../x', 'http://a/b/c/g#s/../x')
|
||||||
|
|
||||||
|
#The following scenarios have been updated in RFC3986
|
||||||
|
#self.checkJoin(RFC2396_BASE, '?y', 'http://a/b/c/?y')
|
||||||
|
#self.checkJoin(RFC2396_BASE, ';x', 'http://a/b/c/;x')
|
||||||
|
|
||||||
|
def test_RFC3986(self):
|
||||||
|
self.checkJoin(RFC3986_BASE, '?y','http://a/b/c/d;p?y')
|
||||||
|
self.checkJoin(RFC2396_BASE, ';x', 'http://a/b/c/;x')
|
||||||
|
|
||||||
def test_urldefrag(self):
|
def test_urldefrag(self):
|
||||||
for url, defrag, frag in [
|
for url, defrag, frag in [
|
||||||
('http://python.org#frag', 'http://python.org', 'frag'),
|
('http://python.org#frag', 'http://python.org', 'frag'),
|
||||||
|
|
|
@ -217,9 +217,18 @@ def urljoin(base, url, allow_fragments=True):
|
||||||
if path[:1] == '/':
|
if path[:1] == '/':
|
||||||
return urlunparse((scheme, netloc, path,
|
return urlunparse((scheme, netloc, path,
|
||||||
params, query, fragment))
|
params, query, fragment))
|
||||||
if not (path or params or query):
|
if not path:
|
||||||
return urlunparse((scheme, netloc, bpath,
|
path = bpath
|
||||||
bparams, bquery, fragment))
|
if not params:
|
||||||
|
params = bparams
|
||||||
|
else:
|
||||||
|
path = path[:-1]
|
||||||
|
return urlunparse((scheme, netloc, path,
|
||||||
|
params, query, fragment))
|
||||||
|
if not query:
|
||||||
|
query = bquery
|
||||||
|
return urlunparse((scheme, netloc, path,
|
||||||
|
params, query, fragment))
|
||||||
segments = bpath.split('/')[:-1] + path.split('/')
|
segments = bpath.split('/')[:-1] + path.split('/')
|
||||||
# XXX The stuff below is bogus in various ways...
|
# XXX The stuff below is bogus in various ways...
|
||||||
if segments[-1] == '.':
|
if segments[-1] == '.':
|
||||||
|
|
Loading…
Reference in New Issue