summaryrefslogtreecommitdiff
path: root/tests/test_httpheaders.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_httpheaders.py')
-rw-r--r--tests/test_httpheaders.py159
1 files changed, 159 insertions, 0 deletions
diff --git a/tests/test_httpheaders.py b/tests/test_httpheaders.py
new file mode 100644
index 0000000..8c560d2
--- /dev/null
+++ b/tests/test_httpheaders.py
@@ -0,0 +1,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