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 152 153 154 155 156 157 158 159
|
from paste.httpheaders import *
import time
def _test_generic(collection):
assert 'bing' == VIA(collection)
REFERER.update(collection,'internal:/some/path')
assert 'internal:/some/path' == REFERER(collection)
CACHE_CONTROL.update(collection,max_age=1234)
CONTENT_DISPOSITION.update(collection,filename="bingles.txt")
PRAGMA.update(collection,"test","multi",'valued="items"')
assert 'public, max-age=1234' == CACHE_CONTROL(collection)
assert 'attachment; filename="bingles.txt"' == \
CONTENT_DISPOSITION(collection)
assert 'test, multi, valued="items"' == PRAGMA(collection)
VIA.delete(collection)
def test_environ():
collection = {'HTTP_VIA':'bing', 'wsgi.version': '1.0' }
_test_generic(collection)
assert collection == {'wsgi.version': '1.0',
'HTTP_PRAGMA': 'test, multi, valued="items"',
'HTTP_REFERER': 'internal:/some/path',
'HTTP_CONTENT_DISPOSITION': 'attachment; filename="bingles.txt"',
'HTTP_CACHE_CONTROL': 'public, max-age=1234'
}
def test_environ_cgi():
environ = {'CONTENT_TYPE': 'text/plain', 'wsgi.version': '1.0',
'HTTP_CONTENT_TYPE': 'ignored/invalid',
'CONTENT_LENGTH': '200'}
assert 'text/plain' == CONTENT_TYPE(environ)
assert '200' == CONTENT_LENGTH(environ)
CONTENT_TYPE.update(environ,'new/type')
assert 'new/type' == CONTENT_TYPE(environ)
CONTENT_TYPE.delete(environ)
assert '' == CONTENT_TYPE(environ)
assert 'ignored/invalid' == environ['HTTP_CONTENT_TYPE']
def test_response_headers():
collection = [('via', 'bing')]
_test_generic(collection)
normalize_headers(collection)
assert collection == [
('Cache-Control', 'public, max-age=1234'),
('Pragma', 'test, multi, valued="items"'),
('Referer', 'internal:/some/path'),
('Content-Disposition', 'attachment; filename="bingles.txt"')
]
def test_cache_control():
assert 'public' == CACHE_CONTROL()
assert 'public' == CACHE_CONTROL(public=True)
assert 'private' == CACHE_CONTROL(private=True)
assert 'no-cache' == CACHE_CONTROL(no_cache=True)
assert 'private, no-store' == CACHE_CONTROL(private=True, no_store=True)
assert 'public, max-age=60' == CACHE_CONTROL(max_age=60)
assert 'public, max-age=86400' == \
CACHE_CONTROL(max_age=CACHE_CONTROL.ONE_DAY)
CACHE_CONTROL.extensions['community'] = str
assert 'public, community="bingles"' == \
CACHE_CONTROL(community="bingles")
headers = []
CACHE_CONTROL.apply(headers,max_age=60)
assert 'public, max-age=60' == CACHE_CONTROL(headers)
assert EXPIRES.parse(headers) > time.time()
assert EXPIRES.parse(headers) < time.time() + 60
def test_content_disposition():
assert 'attachment' == CONTENT_DISPOSITION()
assert 'attachment' == CONTENT_DISPOSITION(attachment=True)
assert 'inline' == CONTENT_DISPOSITION(inline=True)
assert 'inline; filename="test.txt"' == \
CONTENT_DISPOSITION(inline=True, filename="test.txt")
assert 'attachment; filename="test.txt"' == \
CONTENT_DISPOSITION(filename="/some/path/test.txt")
headers = []
CONTENT_DISPOSITION.apply(headers,filename="test.txt")
assert 'text/plain' == CONTENT_TYPE(headers)
CONTENT_DISPOSITION.apply(headers,filename="test")
assert 'text/plain' == CONTENT_TYPE(headers)
CONTENT_DISPOSITION.apply(headers,filename="test.html")
assert 'text/plain' == CONTENT_TYPE(headers)
headers = [('Content-Type', 'application/octet-stream')]
CONTENT_DISPOSITION.apply(headers,filename="test.txt")
assert 'text/plain' == CONTENT_TYPE(headers)
assert headers == [
('Content-Type', 'text/plain'),
('Content-Disposition', 'attachment; filename="test.txt"')
]
def test_range():
assert ('bytes',[(0,300)]) == RANGE.parse("bytes=0-300")
assert ('bytes',[(0,300)]) == RANGE.parse("bytes = -300")
assert ('bytes',[(0,None)]) == RANGE.parse("bytes= -")
assert ('bytes',[(0,None)]) == RANGE.parse("bytes=0 - ")
assert ('bytes',[(300,None)]) == RANGE.parse(" BYTES=300-")
assert ('bytes',[(4,5),(6,7)]) == RANGE.parse(" Bytes = 4 - 5,6 - 07 ")
assert ('bytes',[(0,5),(7,None)]) == RANGE.parse(" bytes=-5,7-")
assert ('bytes',[(0,5),(7,None)]) == RANGE.parse(" bytes=-5,7-")
assert ('bytes',[(0,5),(7,None)]) == RANGE.parse(" bytes=-5,7-")
assert None == RANGE.parse("")
assert None == RANGE.parse("bytes=0,300")
assert None == RANGE.parse("bytes=-7,5-")
def test_copy():
environ = {'HTTP_VIA':'bing', 'wsgi.version': '1.0' }
response_headers = []
VIA.update(response_headers,environ)
assert response_headers == [('Via', 'bing')]
def test_sorting():
# verify the HTTP_HEADERS are set with their canonical form
sample = [WWW_AUTHENTICATE, VIA, ACCEPT, DATE,
ACCEPT_CHARSET, AGE, ALLOW, CACHE_CONTROL,
CONTENT_ENCODING, ETAG, CONTENT_TYPE, FROM,
EXPIRES, RANGE, UPGRADE, VARY, ALLOW]
sample.sort()
sample = [str(x) for x in sample]
assert sample == [
# general headers first
'Cache-Control', 'Date', 'Upgrade', 'Via',
# request headers next
'Accept', 'Accept-Charset', 'From', 'Range',
# response headers following
'Age', 'ETag', 'Vary', 'WWW-Authenticate',
# entity headers (/w expected duplicate)
'Allow', 'Allow', 'Content-Encoding', 'Content-Type', 'Expires'
]
def test_normalize():
response_headers = [
('www-authenticate','Response AuthMessage'),
('unknown-header','Unknown Sorted Last'),
('Via','General Bingles'),
('aLLoW','Entity Allow Something'),
('ETAG','Response 34234'),
('expires','Entity An-Expiration-Date'),
('date','General A-Date')]
normalize_headers(response_headers, strict=False)
assert response_headers == [
('Date', 'General A-Date'),
('Via', 'General Bingles'),
('ETag', 'Response 34234'),
('WWW-Authenticate', 'Response AuthMessage'),
('Allow', 'Entity Allow Something'),
('Expires', 'Entity An-Expiration-Date'),
('Unknown-Header', 'Unknown Sorted Last')]
def test_if_modified_since():
from paste.httpexceptions import HTTPBadRequest
date = 'Thu, 34 Jul 3119 29:34:18 GMT'
try:
x = IF_MODIFIED_SINCE.parse({'HTTP_IF_MODIFIED_SINCE': date,
'wsgi.version': (1, 0)})
except HTTPBadRequest:
pass
else:
assert 0
|