]> granicus.if.org Git - python/commitdiff
Merged revisions 83145 via svnmerge from
authorGregory P. Smith <greg@mad-scientist.com>
Sun, 25 Jul 2010 20:00:02 +0000 (20:00 +0000)
committerGregory P. Smith <greg@mad-scientist.com>
Sun, 25 Jul 2010 20:00:02 +0000 (20:00 +0000)
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.
........

Lib/cookielib.py
Lib/test/test_cookielib.py
Misc/NEWS

index b61a2b2a1a57a2f5ec08888ee665a73fdead769d..5b250905ec5375a28838e80dabee5f7836eaf995 100644 (file)
@@ -607,19 +607,14 @@ def eff_request_host(request):
     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()
index 8394f8ea6e86bd3aa66c9a22a08be361e767fd99..1292b2679314c3a2ae101dc0809c00631877eccb 100644 (file)
@@ -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 @@ class CookieTests(TestCase):
         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 @@ class CookieTests(TestCase):
         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), "/")
index d9cb0eeb538aa1d260affb1dc2c797cad64d3490..2df3b098dc790c31d147a567dc24f67356c5f8c3 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -81,6 +81,9 @@ C-API
 Library
 -------
 
+- Issue #3704: cookielib was not properly handling URLs with a / in the
+  parameters.
+
 - Issue #4629: getopt raises an error if an argument ends with = whereas getopt
   doesn't except a value (eg. --help= is rejected if getopt uses ['help='] long
   options).