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