diff options
author | Gregory P. Smith <greg@mad-scientist.com> | 2010-07-25 19:11:36 (GMT) |
---|---|---|
committer | Gregory P. Smith <greg@mad-scientist.com> | 2010-07-25 19:11:36 (GMT) |
commit | 2a91ce8960d98fe2c98936a73d5e0e7a24856824 (patch) | |
tree | 3e08f842dc9bda2d73a7a35b352fe1f989cd5681 /Lib | |
parent | 137e0b126d87ef745af972eb27da838b83e90c93 (diff) | |
download | cpython-2a91ce8960d98fe2c98936a73d5e0e7a24856824.zip cpython-2a91ce8960d98fe2c98936a73d5e0e7a24856824.tar.gz cpython-2a91ce8960d98fe2c98936a73d5e0e7a24856824.tar.bz2 |
Fixes issue #3704: cookielib was not properly handling URLs with a / in the
parameters.
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/cookielib.py | 17 | ||||
-rw-r--r-- | Lib/test/test_cookielib.py | 28 |
2 files changed, 27 insertions, 18 deletions
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 @@ 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() diff --git a/Lib/test/test_cookielib.py b/Lib/test/test_cookielib.py index f57e0c7..62a275b 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 @@ class CookieTests(TestCase): interact_netscape(c, "http://www.acme.com/blah/rhubarb/", 'eggs="bar"') self.assertIn("/blah/rhubarb", 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.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): 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), "/") |