summaryrefslogtreecommitdiff
path: root/tests/test_httpheaders.py
blob: 8c560d2039a0e2ea73784610f89c94842a28e878 (plain)
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