Skip to content

Commit

Permalink
Issue 1432. Fixes a bug caused because of the evolution
Browse files Browse the repository at this point in the history
of the RFC that describes the behaviour. Note that we now
have the same behaviour than the current browsers.
  • Loading branch information
facundobatista committed Aug 14, 2008
1 parent 7b9cb25 commit 23e3856
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 5 deletions.
11 changes: 9 additions & 2 deletions Lib/test/test_urlparse.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

RFC1808_BASE = "http://a/b/c/d;p?q#f"
RFC2396_BASE = "http://a/b/c/d;p?q"
RFC3986_BASE = "http://a/b/c/d;p?q"

class UrlParseTestCase(unittest.TestCase):

Expand Down Expand Up @@ -167,8 +168,6 @@ def test_RFC1808(self):
def test_RFC2396(self):
# 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', 'http://a/b/c/g')
Expand Down Expand Up @@ -210,6 +209,14 @@ def test_RFC2396(self):
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):
for url, defrag, frag in [
('http://python.org#frag', 'http://python.org', 'frag'),
Expand Down
15 changes: 12 additions & 3 deletions Lib/urllib/parse.py
Original file line number Diff line number Diff line change
Expand Up @@ -219,9 +219,18 @@ def urljoin(base, url, allow_fragments=True):
if path[:1] == '/':
return urlunparse((scheme, netloc, path,
params, query, fragment))
if not (path or params or query):
return urlunparse((scheme, netloc, bpath,
bparams, bquery, fragment))
if not path:
path = bpath
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('/')
# XXX The stuff below is bogus in various ways...
if segments[-1] == '.':
Expand Down

0 comments on commit 23e3856

Please sign in to comment.