Merged revisions 83145 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/release27-maint

........
  r83145 | gregory.p.smith | 2010-07-25 12:11:36 -0700 (Sun, 25 Jul 2010) | 3 lines

  Fixes issue #3704: cookielib was not properly handling URLs with a / in the
  parameters.
........
diff --git a/Lib/cookielib.py b/Lib/cookielib.py
index b61a2b2..5b25090 100644
--- a/Lib/cookielib.py
+++ b/Lib/cookielib.py
@@ -607,19 +607,14 @@
     return req_host, erhn
 
 def request_path(request):
-    """request-URI, as defined by RFC 2965."""
+    """Path component of request-URI, as defined by RFC 2965."""
     url = request.get_full_url()
-    #scheme, netloc, path, parameters, query, frag = urlparse.urlparse(url)
-    #req_path = escape_path("".join(urlparse.urlparse(url)[2:]))
-    path, parameters, query, frag = urlparse.urlparse(url)[2:]
-    if parameters:
-        path = "%s;%s" % (path, parameters)
-    path = escape_path(path)
-    req_path = urlparse.urlunparse(("", "", path, "", query, frag))
-    if not req_path.startswith("/"):
+    parts = urlparse.urlsplit(url)
+    path = escape_path(parts.path)
+    if not path.startswith("/"):
         # fix bad RFC 2396 absoluteURI
-        req_path = "/"+req_path
-    return req_path
+        path = "/" + path
+    return path
 
 def request_port(request):
     host = request.get_host()
diff --git a/Lib/test/test_cookielib.py b/Lib/test/test_cookielib.py
index 8394f8e..1292b26 100644
--- a/Lib/test/test_cookielib.py
+++ b/Lib/test/test_cookielib.py
@@ -1,11 +1,16 @@
 # -*- coding: latin-1 -*-
 """Tests for cookielib.py."""
 
-import re, os, time
+import cookielib
+import os
+import re
+import time
+
 from unittest import TestCase
 
 from test import test_support
 
+
 class DateTimeTests(TestCase):
 
     def test_time2isoz(self):
@@ -563,6 +568,16 @@
         interact_netscape(c, "http://www.acme.com/blah/rhubarb/", 'eggs="bar"')
         self.assert_("/blah/rhubarb" in c._cookies["www.acme.com"])
 
+    def test_default_path_with_query(self):
+        cj = cookielib.CookieJar()
+        uri = "http://example.com/?spam/eggs"
+        value = 'eggs="bar"'
+        interact_netscape(cj, uri, value)
+        # default path does not include query, so is "/", not "/?spam"
+        self.assert_("/" in cj._cookies["example.com"])
+        # cookie is sent back to the same URI
+        self.assertEquals(interact_netscape(cj, uri), value)
+
     def test_escape_path(self):
         from cookielib import escape_path
         cases = [
@@ -591,15 +606,14 @@
         from urllib2 import Request
         from cookielib import request_path
         # with parameters
-        req = Request("http://www.example.com/rheum/rhaponicum;"
+        req = Request("http://www.example.com/rheum/rhaponticum;"
                       "foo=bar;sing=song?apples=pears&spam=eggs#ni")
-        self.assertEquals(request_path(req), "/rheum/rhaponicum;"
-                     "foo=bar;sing=song?apples=pears&spam=eggs#ni")
+        self.assertEquals(request_path(req),
+                          "/rheum/rhaponticum;foo=bar;sing=song")
         # without parameters
-        req = Request("http://www.example.com/rheum/rhaponicum?"
+        req = Request("http://www.example.com/rheum/rhaponticum?"
                       "apples=pears&spam=eggs#ni")
-        self.assertEquals(request_path(req), "/rheum/rhaponicum?"
-                     "apples=pears&spam=eggs#ni")
+        self.assertEquals(request_path(req), "/rheum/rhaponticum")
         # missing final slash
         req = Request("http://www.example.com")
         self.assertEquals(request_path(req), "/")