]> granicus.if.org Git - python/commitdiff
Issue 1432. Fixes a bug caused because of the evolution
authorFacundo Batista <facundobatista@gmail.com>
Thu, 14 Aug 2008 16:55:14 +0000 (16:55 +0000)
committerFacundo Batista <facundobatista@gmail.com>
Thu, 14 Aug 2008 16:55:14 +0000 (16:55 +0000)
of the RFC that describes the behaviour. Note that we now
have the same behaviour than the current browsers.

Lib/test/test_urlparse.py
Lib/urllib/parse.py

index dbb7c36bc1d276f0ae784d56e4baff1f951a3a1e..103f89d4c5a15473494efdc2e6bc722ae6f06c11 100644 (file)
@@ -6,6 +6,7 @@ import urllib.parse
 
 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):
 
@@ -167,8 +168,6 @@ class UrlParseTestCase(unittest.TestCase):
     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')
@@ -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')
 
+        #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'),
index fe02db5e000c143ec843ad4e61fed57dbf573885..3e00695bf9d089c1f097aae528eb07603e969838 100644 (file)
@@ -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] == '.':