+38
-5
lines changedFilter options
+38
-5
lines changed Original file line number Diff line number Diff line change
@@ -990,7 +990,7 @@ def set_ok_path(self, cookie, request):
990
990
req_path = request_path(request)
991
991
if ((cookie.version > 0 or
992
992
(cookie.version == 0 and self.strict_ns_set_path)) and
993
-
not req_path.startswith(cookie.path)):
993
+
not self.path_return_ok(cookie.path, request)):
994
994
_debug(" path attribute %s is not a prefix of request "
995
995
"path %s", cookie.path, req_path)
996
996
return False
@@ -1188,11 +1188,15 @@ def domain_return_ok(self, domain, request):
1188
1188
def path_return_ok(self, path, request):
1189
1189
_debug("- checking cookie path=%s", path)
1190
1190
req_path = request_path(request)
1191
-
if not req_path.startswith(path):
1192
-
_debug(" %s does not path-match %s", req_path, path)
1193
-
return False
1194
-
return True
1191
+
pathlen = len(path)
1192
+
if req_path == path:
1193
+
return True
1194
+
elif (req_path.startswith(path) and
1195
+
(path.endswith("/") or req_path[pathlen:pathlen+1] == "/")):
1196
+
return True
1195
1197
1198
+
_debug(" %s does not path-match %s", req_path, path)
1199
+
return False
1196
1200
1197
1201
def vals_sorted_by_key(adict):
1198
1202
keys = sorted(adict.keys())
Original file line number Diff line number Diff line change
@@ -668,6 +668,32 @@ def test_request_path(self):
668
668
req = urllib.request.Request("http://www.example.com")
669
669
self.assertEqual(request_path(req), "/")
670
670
671
+
def test_path_prefix_match(self):
672
+
pol = DefaultCookiePolicy()
673
+
strict_ns_path_pol = DefaultCookiePolicy(strict_ns_set_path=True)
674
+
675
+
c = CookieJar(pol)
676
+
base_url = "http://bar.com"
677
+
interact_netscape(c, base_url, 'spam=eggs; Path=/foo')
678
+
cookie = c._cookies['bar.com']['/foo']['spam']
679
+
680
+
for path, ok in [('/foo', True),
681
+
('/foo/', True),
682
+
('/foo/bar', True),
683
+
('/', False),
684
+
('/foobad/foo', False)]:
685
+
url = '{0}{1}'.format(base_url, path)
686
+
req = urllib.request.Request(url)
687
+
h = interact_netscape(c, url)
688
+
if ok:
689
+
self.assertIn('spam=eggs', h,
690
+
"cookie not set for {0}".format(path))
691
+
self.assertTrue(strict_ns_path_pol.set_ok_path(cookie, req))
692
+
else:
693
+
self.assertNotIn('spam=eggs', h,
694
+
"cookie set for {0}".format(path))
695
+
self.assertFalse(strict_ns_path_pol.set_ok_path(cookie, req))
696
+
671
697
def test_request_port(self):
672
698
req = urllib.request.Request("http://www.acme.com:1234/",
673
699
headers={"Host": "www.acme.com:4321"})
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
1
+
Don't set cookie for a request when the request path is a prefix match of
2
+
the cookie's path attribute but doesn't end with "/". Patch by Karthikeyan
3
+
Singaravelan.
You can’t perform that action at this time.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4