blob: 8c560d2039a0e2ea73784610f89c94842a28e878 [file] [log] [blame]
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