1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
|
"""Tests for ClientCookie._HeadersUtil."""
import mechanize._headersutil
from mechanize._testcase import TestCase
class IsHtmlTests(TestCase):
def test_is_html(self):
def check(headers, extension, is_html):
url = "http://example.com/foo" + extension
self.assertEqual(
mechanize._headersutil.is_html(headers, url, allow_xhtml),
is_html)
for allow_xhtml in False, True:
check(["text/html"], ".html", True),
check(["text/html", "text/plain"], ".html", True)
# Content-type takes priority over file extension from URL
check(["text/html"], ".txt", True)
check(["text/plain"], ".html", False)
# use extension if no Content-Type
check([], ".html", True)
check([], ".gif", False)
# don't regard XHTML as HTML (unless user explicitly asks for it),
# since we don't yet handle XML properly
check([], ".xhtml", allow_xhtml)
check(["text/xhtml"], ".xhtml", allow_xhtml)
# header with empty value
check([""], ".txt", False)
class HeaderTests(TestCase):
def test_parse_ns_headers_expires(self):
from mechanize._headersutil import parse_ns_headers
# quotes should be stripped
self.assertEqual(
parse_ns_headers(['foo=bar; expires=01 Jan 2040 22:23:32 GMT']),
[[('foo', 'bar'), ('expires', 2209069412), ('version', '0')]])
self.assertEqual(
parse_ns_headers(['foo=bar; expires="01 Jan 2040 22:23:32 GMT"']),
[[('foo', 'bar'), ('expires', 2209069412), ('version', '0')]])
def test_parse_ns_headers_version(self):
from mechanize._headersutil import parse_ns_headers
# quotes should be stripped
expected = [[('foo', 'bar'), ('version', '1')]]
for hdr in [
'foo=bar; version="1"',
'foo=bar; Version="1"',
]:
self.assertEqual(parse_ns_headers([hdr]), expected)
def test_parse_ns_headers_special_names(self):
# names such as 'expires' are not special in first name=value pair
# of Set-Cookie: header
from mechanize._headersutil import parse_ns_headers
# Cookie with name 'expires'
hdr = 'expires=01 Jan 2040 22:23:32 GMT'
expected = [
[("expires", "01 Jan 2040 22:23:32 GMT"), ("version", "0")]]
self.assertEqual(parse_ns_headers([hdr]), expected)
def test_join_header_words(self):
from mechanize._headersutil import join_header_words
assert join_header_words([[
("foo", None), ("bar", "baz"), (None, "value")
]]) == "foo; bar=baz; value"
assert join_header_words([[]]) == ""
def test_split_header_words(self):
from mechanize._headersutil import split_header_words
tests = [
("foo", [[("foo", None)]]),
("foo=bar", [[("foo", "bar")]]),
(" foo ", [[("foo", None)]]),
(" foo= ", [[("foo", "")]]),
(" foo=", [[("foo", "")]]),
(" foo= ; ", [[("foo", "")]]),
(" foo= ; bar= baz ", [[("foo", ""), ("bar", "baz")]]),
("foo=bar bar=baz", [[("foo", "bar"), ("bar", "baz")]]),
# doesn't really matter if this next fails, but it works ATM
("foo= bar=baz", [[("foo", "bar=baz")]]),
("foo=bar;bar=baz", [[("foo", "bar"), ("bar", "baz")]]),
('foo bar baz', [[("foo", None), ("bar", None), ("baz", None)]]),
("a, b, c", [[("a", None)], [("b", None)], [("c", None)]]),
(r'foo; bar=baz, spam=, foo="\,\;\"", bar= ',
[[("foo", None), ("bar", "baz")],
[("spam", "")], [("foo", ',;"')], [("bar", "")]]),
]
for arg, expect in tests:
try:
result = split_header_words([arg])
except Exception:
import traceback
from io import StringIO
f = StringIO()
traceback.print_exc(None, f)
result = "(error -- traceback follows)\n\n%s" % f.getvalue()
assert result == expect, """
When parsing: '%s'
Expected: '%s'
Got: '%s'
""" % (arg, expect, result)
def test_roundtrip(self):
from mechanize._headersutil import (
split_header_words, join_header_words)
tests = [
("foo", "foo"),
("foo=bar", "foo=bar"),
(" foo ", "foo"),
("foo=", 'foo=""'),
("foo=bar bar=baz", "foo=bar; bar=baz"),
("foo=bar;bar=baz", "foo=bar; bar=baz"),
('foo bar baz', "foo; bar; baz"),
(r'foo="\"" bar="\\"', r'foo="\""; bar="\\"'),
('foo,,,bar', 'foo, bar'),
('foo=bar,bar=baz', 'foo=bar, bar=baz'),
('text/html; charset=iso-8859-1',
'text/html; charset="iso-8859-1"'),
('foo="bar"; port="80,81"; discard, bar=baz',
'foo=bar; port="80,81"; discard, bar=baz'),
(r'Basic realm="\"foo\\\\bar\""',
r'Basic; realm="\"foo\\\\bar\""')
]
for arg, expect in tests:
input = split_header_words([arg])
res = join_header_words(input)
assert res == expect, """
When parsing: '%s'
Expected: '%s'
Got: '%s'
Input was: '%s'""" % (arg, expect, res, input)
if __name__ == "__main__":
import unittest
unittest.main()
|