aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/test_http_cookies.py115
1 files changed, 112 insertions, 3 deletions
diff --git a/test/test_http_cookies.py b/test/test_http_cookies.py
index 31e5f0b0..c0e5a5b7 100644
--- a/test/test_http_cookies.py
+++ b/test/test_http_cookies.py
@@ -1,6 +1,8 @@
-from netlib import http_cookies, odict
+import pprint
import nose.tools
+from netlib import http_cookies, odict
+
def test_read_token():
tokens = [
@@ -66,6 +68,10 @@ def test_read_pairs():
def test_pairs_roundtrips():
pairs = [
[
+ "",
+ []
+ ],
+ [
"one=uno",
[["one", "uno"]]
],
@@ -110,5 +116,108 @@ def test_pairs_roundtrips():
nose.tools.eq_(ret, lst)
-def test_parse_set_cookie():
- pass
+def test_cookie_roundtrips():
+ pairs = [
+ [
+ "one=uno",
+ [["one", "uno"]]
+ ],
+ [
+ "one=uno; two=due",
+ [["one", "uno"], ["two", "due"]]
+ ],
+ ]
+ for s, lst in pairs:
+ ret = http_cookies.parse_cookie_header(s)
+ nose.tools.eq_(ret.lst, lst)
+ s2 = http_cookies.format_cookie_header(ret)
+ ret = http_cookies.parse_cookie_header(s2)
+ nose.tools.eq_(ret.lst, lst)
+
+
+# TODO
+# I've seen the following pathological cookie in the wild:
+#
+# cid=09,0,0,0,0; expires=Wed, 10-Jun-2015 21:54:53 GMT; path=/
+#
+# It's not compliant under any RFC - the latest RFC prohibits commas in cookie
+# values completely, earlier RFCs require them to be within a quoted string.
+#
+# If we ditch support for earlier RFCs, we can handle this correctly. This
+# leaves us with the question: what's more common, multiple-value Set-Cookie
+# headers, or Set-Cookie headers that violate the standards?
+
+def test_parse_set_cookie_pairs():
+ pairs = [
+ [
+ "one=uno",
+ [
+ ["one", "uno"]
+ ]
+ ],
+ [
+ "one=uno; foo",
+ [
+ ["one", "uno"],
+ ["foo", None]
+ ]
+ ],
+ [
+ "mun=1.390.f60; "
+ "expires=sun, 11-oct-2015 12:38:31 gmt; path=/; "
+ "domain=b.aol.com",
+ [
+ ["mun", "1.390.f60"],
+ ["expires", "sun, 11-oct-2015 12:38:31 gmt"],
+ ["path", "/"],
+ ["domain", "b.aol.com"]
+ ]
+ ],
+ [
+ r'rpb=190%3d1%2616726%3d1%2634832%3d1%2634874%3d1; '
+ 'domain=.rubiconproject.com; '
+ 'expires=mon, 11-may-2015 21:54:57 gmt; '
+ 'path=/',
+ [
+ ['rpb', r'190%3d1%2616726%3d1%2634832%3d1%2634874%3d1'],
+ ['domain', '.rubiconproject.com'],
+ ['expires', 'mon, 11-may-2015 21:54:57 gmt'],
+ ['path', '/']
+ ]
+ ],
+ ]
+ for s, lst in pairs:
+ ret = http_cookies._parse_set_cookie_pairs(s)
+ nose.tools.eq_(ret, lst)
+ s2 = http_cookies._format_set_cookie_pairs(ret)
+ ret2 = http_cookies._parse_set_cookie_pairs(s2)
+ nose.tools.eq_(ret2, lst)
+
+
+def test_parse_set_cookie_header():
+ vals = [
+ [
+ "", None
+ ],
+ [
+ "one=uno",
+ ("one", "uno", [])
+ ],
+ [
+ "one=uno; foo=bar",
+ ("one", "uno", [["foo", "bar"]])
+ ]
+ ]
+ for s, expected in vals:
+ ret = http_cookies.parse_set_cookie_header(s)
+ if expected:
+ assert ret[0] == expected[0]
+ assert ret[1] == expected[1]
+ nose.tools.eq_(ret[2].lst, expected[2])
+ s2 = http_cookies.format_set_cookie_header(*ret)
+ ret2 = http_cookies.parse_set_cookie_header(s2)
+ assert ret2[0] == expected[0]
+ assert ret2[1] == expected[1]
+ nose.tools.eq_(ret2[2].lst, expected[2])
+ else:
+ assert ret is None