From 2c4973dd4a08be5aba88726b5872c95d3069c34b Mon Sep 17 00:00:00 2001 From: "Gregory P. Smith" Date: Sun, 25 Jul 2010 19:53:20 +0000 Subject: [PATCH] Merged revisions 82985 via svnmerge from svn+ssh://pythondev@svn.python.org/python/branches/py3k ........ r82985 | gregory.p.smith | 2010-07-19 16:17:22 -0700 (Mon, 19 Jul 2010) | 3 lines Fixes Issue #3704: http.cookiejar was not properly handling URLs with a / in the parameters. (This is jjlee's issue3704.patch ported to py3k) ........ --- Lib/http/cookiejar.py | 15 ++++---- Lib/test/test_http_cookiejar.py | 64 +++++++++++++++++++-------------- Misc/NEWS | 3 ++ 3 files changed, 47 insertions(+), 35 deletions(-) diff --git a/Lib/http/cookiejar.py b/Lib/http/cookiejar.py index e9efab88df..2604817870 100644 --- a/Lib/http/cookiejar.py +++ b/Lib/http/cookiejar.py @@ -603,17 +603,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() - path, parameters, query, frag = urllib.parse.urlparse(url)[2:] - if parameters: - path = "%s;%s" % (path, parameters) - path = escape_path(path) - req_path = urllib.parse.urlunparse(("", "", path, "", query, frag)) - if not req_path.startswith("/"): + parts = urllib.parse.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_http_cookiejar.py b/Lib/test/test_http_cookiejar.py index e5f7143200..d495586d93 100644 --- a/Lib/test/test_http_cookiejar.py +++ b/Lib/test/test_http_cookiejar.py @@ -1,18 +1,21 @@ """Tests for http/cookiejar.py.""" -import re, os, time, urllib.request -from unittest import TestCase +import os +import re +import test.support +import time +import unittest +import urllib.request -from test import support +from http.cookiejar import (time2isoz, http2time, time2netscape, + parse_ns_headers, join_header_words, split_header_words, Cookie, + CookieJar, DefaultCookiePolicy, LWPCookieJar, MozillaCookieJar, + LoadError, lwp_cookie_str, DEFAULT_HTTP_PORT, escape_path, + reach, is_HDN, domain_match, user_domain_match, request_path, + request_port, request_host) -from http.cookiejar import time2isoz, http2time, time2netscape, \ - parse_ns_headers, join_header_words, split_header_words, Cookie, \ - CookieJar, DefaultCookiePolicy, LWPCookieJar, MozillaCookieJar, \ - LoadError, lwp_cookie_str, DEFAULT_HTTP_PORT, escape_path, \ - reach, is_HDN, domain_match, user_domain_match, request_path, \ - request_port, request_host -class DateTimeTests(TestCase): +class DateTimeTests(unittest.TestCase): def test_time2isoz(self): base = 1019227000 @@ -96,7 +99,7 @@ class DateTimeTests(TestCase): ) -class HeaderTests(TestCase): +class HeaderTests(unittest.TestCase): def test_parse_ns_headers(self): # quotes should be stripped expected = [[('foo', 'bar'), ('expires', 2209069412), ('version', '0')]] @@ -217,10 +220,10 @@ def _interact(cookiejar, url, set_cookie_hdrs, hdr_name): return cookie_hdr -class FileCookieJarTests(TestCase): +class FileCookieJarTests(unittest.TestCase): def test_lwp_valueless_cookie(self): # cookies with no value should be saved and loaded consistently - filename = support.TESTFN + filename = test.support.TESTFN c = LWPCookieJar() interact_netscape(c, "http://www.acme.com/", 'boo') self.assertEqual(c._cookies["www.acme.com"]["/"]["boo"].value, None) @@ -235,7 +238,7 @@ class FileCookieJarTests(TestCase): def test_bad_magic(self): # IOErrors (eg. file doesn't exist) are allowed to propagate - filename = support.TESTFN + filename = test.support.TESTFN for cookiejar_class in LWPCookieJar, MozillaCookieJar: c = cookiejar_class() try: @@ -258,7 +261,7 @@ class FileCookieJarTests(TestCase): try: os.unlink(filename) except OSError: pass -class CookieTests(TestCase): +class CookieTests(unittest.TestCase): # XXX # Get rid of string comparisons where not actually testing str / repr. # .clear() etc. @@ -338,7 +341,7 @@ class CookieTests(TestCase): def test_missing_value(self): # missing = sign in Cookie: header is regarded by Mozilla as a missing # name, and by http.cookiejar as a missing value - filename = support.TESTFN + filename = test.support.TESTFN c = MozillaCookieJar(filename) interact_netscape(c, "http://www.acme.com/", 'eggs') interact_netscape(c, "http://www.acme.com/", '"spam"; path=/foo/') @@ -522,6 +525,16 @@ class CookieTests(TestCase): interact_netscape(c, "http://www.acme.com/blah/rhubarb/", 'eggs="bar"') self.assertTrue("/blah/rhubarb" in c._cookies["www.acme.com"]) + def test_default_path_with_query(self): + cj = 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.assertIn("/", cj._cookies["example.com"]) + # Cookie is sent back to the same URI. + self.assertEquals(interact_netscape(cj, uri), value) + def test_escape_path(self): cases = [ # quoted safe @@ -550,16 +563,15 @@ class CookieTests(TestCase): def test_request_path(self): # with parameters req = urllib.request.Request( - "http://www.example.com/rheum/rhaponicum;" + "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 = urllib.request.Request( - "http://www.example.com/rheum/rhaponicum?" + "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 = urllib.request.Request("http://www.example.com") self.assertEquals(request_path(req), "/") @@ -1033,7 +1045,7 @@ class CookieTests(TestCase): self.assertTrue(cookie.expires is None) -class LWPCookieTests(TestCase): +class LWPCookieTests(unittest.TestCase): # Tests taken from libwww-perl, with a few modifications and additions. def test_netscape_example_1(self): @@ -1423,7 +1435,7 @@ class LWPCookieTests(TestCase): self.assertEquals(len(c), 6) # save and restore - filename = support.TESTFN + filename = test.support.TESTFN try: c.save(filename, ignore_discard=True) @@ -1462,7 +1474,7 @@ class LWPCookieTests(TestCase): # Save / load Mozilla/Netscape cookie file format. year_plus_one = time.localtime()[0] + 1 - filename = support.TESTFN + filename = test.support.TESTFN c = MozillaCookieJar(filename, policy=DefaultCookiePolicy(rfc2965=True)) @@ -1624,7 +1636,7 @@ class LWPCookieTests(TestCase): def test_main(verbose=None): - support.run_unittest( + test.support.run_unittest( DateTimeTests, HeaderTests, CookieTests, diff --git a/Misc/NEWS b/Misc/NEWS index c6777cec5d..833d0deef6 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -78,6 +78,9 @@ C-API Library ------- +- Issue #3704: http.cookiejar 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). -- 2.40.0