xref: /unit/test/test_http_header.py (revision 1467)
11065Szelenkov@nginx.comimport unittest
21019Szelenkov@nginx.comfrom unit.applications.lang.python import TestApplicationPython
3578Szelenkov@nginx.com
41017Szelenkov@nginx.com
51019Szelenkov@nginx.comclass TestHTTPHeader(TestApplicationPython):
6*1467Szelenkov@nginx.com    prerequisites = {'modules': {'python': 'any'}}
7578Szelenkov@nginx.com
8578Szelenkov@nginx.com    def test_http_header_value_leading_sp(self):
9578Szelenkov@nginx.com        self.load('custom_header')
10578Szelenkov@nginx.com
111017Szelenkov@nginx.com        resp = self.get(
121017Szelenkov@nginx.com            headers={
131017Szelenkov@nginx.com                'Host': 'localhost',
141017Szelenkov@nginx.com                'Custom-Header': ' ,',
151017Szelenkov@nginx.com                'Connection': 'close',
161017Szelenkov@nginx.com            }
171017Szelenkov@nginx.com        )
18578Szelenkov@nginx.com
19578Szelenkov@nginx.com        self.assertEqual(resp['status'], 200, 'value leading sp status')
201017Szelenkov@nginx.com        self.assertEqual(
211017Szelenkov@nginx.com            resp['headers']['Custom-Header'],
221017Szelenkov@nginx.com            ',',
231017Szelenkov@nginx.com            'value leading sp custom header',
241017Szelenkov@nginx.com        )
25578Szelenkov@nginx.com
26578Szelenkov@nginx.com    def test_http_header_value_leading_htab(self):
27578Szelenkov@nginx.com        self.load('custom_header')
28578Szelenkov@nginx.com
291017Szelenkov@nginx.com        resp = self.get(
301017Szelenkov@nginx.com            headers={
311017Szelenkov@nginx.com                'Host': 'localhost',
321017Szelenkov@nginx.com                'Custom-Header': '\t,',
331017Szelenkov@nginx.com                'Connection': 'close',
341017Szelenkov@nginx.com            }
351017Szelenkov@nginx.com        )
36578Szelenkov@nginx.com
37578Szelenkov@nginx.com        self.assertEqual(resp['status'], 200, 'value leading htab status')
381017Szelenkov@nginx.com        self.assertEqual(
391017Szelenkov@nginx.com            resp['headers']['Custom-Header'],
401017Szelenkov@nginx.com            ',',
411017Szelenkov@nginx.com            'value leading htab custom header',
421017Szelenkov@nginx.com        )
43578Szelenkov@nginx.com
44578Szelenkov@nginx.com    def test_http_header_value_trailing_sp(self):
45578Szelenkov@nginx.com        self.load('custom_header')
46578Szelenkov@nginx.com
471017Szelenkov@nginx.com        resp = self.get(
481017Szelenkov@nginx.com            headers={
491017Szelenkov@nginx.com                'Host': 'localhost',
501017Szelenkov@nginx.com                'Custom-Header': ', ',
511017Szelenkov@nginx.com                'Connection': 'close',
521017Szelenkov@nginx.com            }
531017Szelenkov@nginx.com        )
54578Szelenkov@nginx.com
55578Szelenkov@nginx.com        self.assertEqual(resp['status'], 200, 'value trailing sp status')
561017Szelenkov@nginx.com        self.assertEqual(
571017Szelenkov@nginx.com            resp['headers']['Custom-Header'],
581017Szelenkov@nginx.com            ',',
591017Szelenkov@nginx.com            'value trailing sp custom header',
601017Szelenkov@nginx.com        )
61578Szelenkov@nginx.com
62578Szelenkov@nginx.com    def test_http_header_value_trailing_htab(self):
63578Szelenkov@nginx.com        self.load('custom_header')
64578Szelenkov@nginx.com
651017Szelenkov@nginx.com        resp = self.get(
661017Szelenkov@nginx.com            headers={
671017Szelenkov@nginx.com                'Host': 'localhost',
681017Szelenkov@nginx.com                'Custom-Header': ',\t',
691017Szelenkov@nginx.com                'Connection': 'close',
701017Szelenkov@nginx.com            }
711017Szelenkov@nginx.com        )
72578Szelenkov@nginx.com
73578Szelenkov@nginx.com        self.assertEqual(resp['status'], 200, 'value trailing htab status')
741017Szelenkov@nginx.com        self.assertEqual(
751017Szelenkov@nginx.com            resp['headers']['Custom-Header'],
761017Szelenkov@nginx.com            ',',
771017Szelenkov@nginx.com            'value trailing htab custom header',
781017Szelenkov@nginx.com        )
79578Szelenkov@nginx.com
80578Szelenkov@nginx.com    def test_http_header_value_both_sp(self):
81578Szelenkov@nginx.com        self.load('custom_header')
82578Szelenkov@nginx.com
831017Szelenkov@nginx.com        resp = self.get(
841017Szelenkov@nginx.com            headers={
851017Szelenkov@nginx.com                'Host': 'localhost',
861017Szelenkov@nginx.com                'Custom-Header': ' , ',
871017Szelenkov@nginx.com                'Connection': 'close',
881017Szelenkov@nginx.com            }
891017Szelenkov@nginx.com        )
90578Szelenkov@nginx.com
91578Szelenkov@nginx.com        self.assertEqual(resp['status'], 200, 'value both sp status')
921017Szelenkov@nginx.com        self.assertEqual(
931017Szelenkov@nginx.com            resp['headers']['Custom-Header'],
941017Szelenkov@nginx.com            ',',
951017Szelenkov@nginx.com            'value both sp custom header',
961017Szelenkov@nginx.com        )
97578Szelenkov@nginx.com
98578Szelenkov@nginx.com    def test_http_header_value_both_htab(self):
99578Szelenkov@nginx.com        self.load('custom_header')
100578Szelenkov@nginx.com
1011017Szelenkov@nginx.com        resp = self.get(
1021017Szelenkov@nginx.com            headers={
1031017Szelenkov@nginx.com                'Host': 'localhost',
1041017Szelenkov@nginx.com                'Custom-Header': '\t,\t',
1051017Szelenkov@nginx.com                'Connection': 'close',
1061017Szelenkov@nginx.com            }
1071017Szelenkov@nginx.com        )
108578Szelenkov@nginx.com
109578Szelenkov@nginx.com        self.assertEqual(resp['status'], 200, 'value both htab status')
1101017Szelenkov@nginx.com        self.assertEqual(
1111017Szelenkov@nginx.com            resp['headers']['Custom-Header'],
1121017Szelenkov@nginx.com            ',',
1131017Szelenkov@nginx.com            'value both htab custom header',
1141017Szelenkov@nginx.com        )
115578Szelenkov@nginx.com
116578Szelenkov@nginx.com    def test_http_header_value_chars(self):
117578Szelenkov@nginx.com        self.load('custom_header')
118578Szelenkov@nginx.com
1191017Szelenkov@nginx.com        resp = self.get(
1201017Szelenkov@nginx.com            headers={
1211017Szelenkov@nginx.com                'Host': 'localhost',
1221017Szelenkov@nginx.com                'Custom-Header': '(),/:;<=>?@[\]{}\t !#$%&\'*+-.^_`|~',
1231017Szelenkov@nginx.com                'Connection': 'close',
1241017Szelenkov@nginx.com            }
1251017Szelenkov@nginx.com        )
126578Szelenkov@nginx.com
127578Szelenkov@nginx.com        self.assertEqual(resp['status'], 200, 'value chars status')
1281017Szelenkov@nginx.com        self.assertEqual(
1291017Szelenkov@nginx.com            resp['headers']['Custom-Header'],
1301017Szelenkov@nginx.com            '(),/:;<=>?@[\]{}\t !#$%&\'*+-.^_`|~',
1311017Szelenkov@nginx.com            'value chars custom header',
1321017Szelenkov@nginx.com        )
133578Szelenkov@nginx.com
134720Szelenkov@nginx.com    def test_http_header_value_chars_edge(self):
135720Szelenkov@nginx.com        self.load('custom_header')
136720Szelenkov@nginx.com
1371017Szelenkov@nginx.com        resp = self.http(
1381017Szelenkov@nginx.com            b"""GET / HTTP/1.1
139738Szelenkov@nginx.comHost: localhost
140738Szelenkov@nginx.comCustom-Header: \x20\xFF
141738Szelenkov@nginx.comConnection: close
142738Szelenkov@nginx.com
1431017Szelenkov@nginx.com""",
1441017Szelenkov@nginx.com            raw=True,
1451017Szelenkov@nginx.com            encoding='latin1',
1461017Szelenkov@nginx.com        )
147720Szelenkov@nginx.com
148720Szelenkov@nginx.com        self.assertEqual(resp['status'], 200, 'value chars edge status')
1491017Szelenkov@nginx.com        self.assertEqual(
1501017Szelenkov@nginx.com            resp['headers']['Custom-Header'], '\xFF', 'value chars edge'
1511017Szelenkov@nginx.com        )
152720Szelenkov@nginx.com
153720Szelenkov@nginx.com    def test_http_header_value_chars_below(self):
154720Szelenkov@nginx.com        self.load('custom_header')
155720Szelenkov@nginx.com
1561017Szelenkov@nginx.com        resp = self.http(
1571017Szelenkov@nginx.com            b"""GET / HTTP/1.1
158738Szelenkov@nginx.comHost: localhost
159738Szelenkov@nginx.comCustom-Header: \x1F
160738Szelenkov@nginx.comConnection: close
161738Szelenkov@nginx.com
1621017Szelenkov@nginx.com""",
1631017Szelenkov@nginx.com            raw=True,
1641017Szelenkov@nginx.com        )
165720Szelenkov@nginx.com
166720Szelenkov@nginx.com        self.assertEqual(resp['status'], 400, 'value chars below')
167720Szelenkov@nginx.com
168578Szelenkov@nginx.com    def test_http_header_field_leading_sp(self):
169578Szelenkov@nginx.com        self.load('empty')
170578Szelenkov@nginx.com
1711017Szelenkov@nginx.com        resp = self.get(
1721017Szelenkov@nginx.com            headers={
1731017Szelenkov@nginx.com                'Host': 'localhost',
1741017Szelenkov@nginx.com                ' Custom-Header': 'blah',
1751017Szelenkov@nginx.com                'Connection': 'close',
1761017Szelenkov@nginx.com            }
1771017Szelenkov@nginx.com        )
178578Szelenkov@nginx.com
179578Szelenkov@nginx.com        self.assertEqual(resp['status'], 400, 'field leading sp')
180578Szelenkov@nginx.com
181578Szelenkov@nginx.com    def test_http_header_field_leading_htab(self):
182578Szelenkov@nginx.com        self.load('empty')
183578Szelenkov@nginx.com
1841017Szelenkov@nginx.com        resp = self.get(
1851017Szelenkov@nginx.com            headers={
1861017Szelenkov@nginx.com                'Host': 'localhost',
1871017Szelenkov@nginx.com                '\tCustom-Header': 'blah',
1881017Szelenkov@nginx.com                'Connection': 'close',
1891017Szelenkov@nginx.com            }
1901017Szelenkov@nginx.com        )
191578Szelenkov@nginx.com
192578Szelenkov@nginx.com        self.assertEqual(resp['status'], 400, 'field leading htab')
193578Szelenkov@nginx.com
194578Szelenkov@nginx.com    def test_http_header_field_trailing_sp(self):
195578Szelenkov@nginx.com        self.load('empty')
196578Szelenkov@nginx.com
1971017Szelenkov@nginx.com        resp = self.get(
1981017Szelenkov@nginx.com            headers={
1991017Szelenkov@nginx.com                'Host': 'localhost',
2001017Szelenkov@nginx.com                'Custom-Header ': 'blah',
2011017Szelenkov@nginx.com                'Connection': 'close',
2021017Szelenkov@nginx.com            }
2031017Szelenkov@nginx.com        )
204578Szelenkov@nginx.com
205578Szelenkov@nginx.com        self.assertEqual(resp['status'], 400, 'field trailing sp')
206578Szelenkov@nginx.com
207578Szelenkov@nginx.com    def test_http_header_field_trailing_htab(self):
208578Szelenkov@nginx.com        self.load('empty')
209578Szelenkov@nginx.com
2101017Szelenkov@nginx.com        resp = self.get(
2111017Szelenkov@nginx.com            headers={
2121017Szelenkov@nginx.com                'Host': 'localhost',
2131017Szelenkov@nginx.com                'Custom-Header\t': 'blah',
2141017Szelenkov@nginx.com                'Connection': 'close',
2151017Szelenkov@nginx.com            }
2161017Szelenkov@nginx.com        )
217578Szelenkov@nginx.com
218578Szelenkov@nginx.com        self.assertEqual(resp['status'], 400, 'field trailing htab')
219578Szelenkov@nginx.com
220936Szelenkov@nginx.com    def test_http_header_content_length_big(self):
221936Szelenkov@nginx.com        self.load('empty')
222936Szelenkov@nginx.com
2231017Szelenkov@nginx.com        self.assertEqual(
2241017Szelenkov@nginx.com            self.post(
2251017Szelenkov@nginx.com                headers={
2261017Szelenkov@nginx.com                    'Host': 'localhost',
2271017Szelenkov@nginx.com                    'Content-Length': str(2 ** 64),
2281017Szelenkov@nginx.com                    'Connection': 'close',
2291017Szelenkov@nginx.com                },
2301017Szelenkov@nginx.com                body='X' * 1000,
2311017Szelenkov@nginx.com            )['status'],
2321017Szelenkov@nginx.com            400,
2331017Szelenkov@nginx.com            'Content-Length big',
2341017Szelenkov@nginx.com        )
235936Szelenkov@nginx.com
236936Szelenkov@nginx.com    def test_http_header_content_length_negative(self):
237936Szelenkov@nginx.com        self.load('empty')
238936Szelenkov@nginx.com
2391017Szelenkov@nginx.com        self.assertEqual(
2401017Szelenkov@nginx.com            self.post(
2411017Szelenkov@nginx.com                headers={
2421017Szelenkov@nginx.com                    'Host': 'localhost',
2431017Szelenkov@nginx.com                    'Content-Length': '-100',
2441017Szelenkov@nginx.com                    'Connection': 'close',
2451017Szelenkov@nginx.com                },
2461017Szelenkov@nginx.com                body='X' * 1000,
2471017Szelenkov@nginx.com            )['status'],
2481017Szelenkov@nginx.com            400,
2491017Szelenkov@nginx.com            'Content-Length negative',
2501017Szelenkov@nginx.com        )
251936Szelenkov@nginx.com
252936Szelenkov@nginx.com    def test_http_header_content_length_text(self):
253936Szelenkov@nginx.com        self.load('empty')
254936Szelenkov@nginx.com
2551017Szelenkov@nginx.com        self.assertEqual(
2561017Szelenkov@nginx.com            self.post(
2571017Szelenkov@nginx.com                headers={
2581017Szelenkov@nginx.com                    'Host': 'localhost',
2591017Szelenkov@nginx.com                    'Content-Length': 'blah',
2601017Szelenkov@nginx.com                    'Connection': 'close',
2611017Szelenkov@nginx.com                },
2621017Szelenkov@nginx.com                body='X' * 1000,
2631017Szelenkov@nginx.com            )['status'],
2641017Szelenkov@nginx.com            400,
2651017Szelenkov@nginx.com            'Content-Length text',
2661017Szelenkov@nginx.com        )
267936Szelenkov@nginx.com
268936Szelenkov@nginx.com    def test_http_header_content_length_multiple_values(self):
269936Szelenkov@nginx.com        self.load('empty')
270936Szelenkov@nginx.com
2711017Szelenkov@nginx.com        self.assertEqual(
2721017Szelenkov@nginx.com            self.post(
2731017Szelenkov@nginx.com                headers={
2741017Szelenkov@nginx.com                    'Host': 'localhost',
2751017Szelenkov@nginx.com                    'Content-Length': '41, 42',
2761017Szelenkov@nginx.com                    'Connection': 'close',
2771017Szelenkov@nginx.com                },
2781017Szelenkov@nginx.com                body='X' * 1000,
2791017Szelenkov@nginx.com            )['status'],
2801017Szelenkov@nginx.com            400,
2811017Szelenkov@nginx.com            'Content-Length multiple value',
2821017Szelenkov@nginx.com        )
283936Szelenkov@nginx.com
284936Szelenkov@nginx.com    def test_http_header_content_length_multiple_fields(self):
285936Szelenkov@nginx.com        self.load('empty')
286936Szelenkov@nginx.com
2871017Szelenkov@nginx.com        self.assertEqual(
2881017Szelenkov@nginx.com            self.post(
2891017Szelenkov@nginx.com                headers={
2901017Szelenkov@nginx.com                    'Host': 'localhost',
2911017Szelenkov@nginx.com                    'Content-Length': ['41', '42'],
2921017Szelenkov@nginx.com                    'Connection': 'close',
2931017Szelenkov@nginx.com                },
2941017Szelenkov@nginx.com                body='X' * 1000,
2951017Szelenkov@nginx.com            )['status'],
2961017Szelenkov@nginx.com            400,
2971017Szelenkov@nginx.com            'Content-Length multiple fields',
2981017Szelenkov@nginx.com        )
299936Szelenkov@nginx.com
3001065Szelenkov@nginx.com    @unittest.skip('not yet')
301973Szelenkov@nginx.com    def test_http_header_host_absent(self):
302973Szelenkov@nginx.com        self.load('host')
303973Szelenkov@nginx.com
304973Szelenkov@nginx.com        resp = self.get(headers={'Connection': 'close'})
305973Szelenkov@nginx.com
3061065Szelenkov@nginx.com        self.assertEqual(resp['status'], 400, 'Host absent status')
307973Szelenkov@nginx.com
308973Szelenkov@nginx.com    def test_http_header_host_empty(self):
309973Szelenkov@nginx.com        self.load('host')
310973Szelenkov@nginx.com
3111017Szelenkov@nginx.com        resp = self.get(headers={'Host': '', 'Connection': 'close'})
312973Szelenkov@nginx.com
313973Szelenkov@nginx.com        self.assertEqual(resp['status'], 200, 'Host empty status')
3141017Szelenkov@nginx.com        self.assertNotEqual(
3151017Szelenkov@nginx.com            resp['headers']['X-Server-Name'], '', 'Host empty SERVER_NAME'
3161017Szelenkov@nginx.com        )
317973Szelenkov@nginx.com
318973Szelenkov@nginx.com    def test_http_header_host_big(self):
319973Szelenkov@nginx.com        self.load('empty')
320973Szelenkov@nginx.com
3211017Szelenkov@nginx.com        self.assertEqual(
3221017Szelenkov@nginx.com            self.get(headers={'Host': 'X' * 10000, 'Connection': 'close'})[
3231017Szelenkov@nginx.com                'status'
3241017Szelenkov@nginx.com            ],
3251017Szelenkov@nginx.com            431,
3261017Szelenkov@nginx.com            'Host big',
3271017Szelenkov@nginx.com        )
328973Szelenkov@nginx.com
329973Szelenkov@nginx.com    def test_http_header_host_port(self):
330973Szelenkov@nginx.com        self.load('host')
331973Szelenkov@nginx.com
3321017Szelenkov@nginx.com        resp = self.get(
3331017Szelenkov@nginx.com            headers={'Host': 'exmaple.com:7080', 'Connection': 'close'}
3341017Szelenkov@nginx.com        )
335973Szelenkov@nginx.com
336973Szelenkov@nginx.com        self.assertEqual(resp['status'], 200, 'Host port status')
3371017Szelenkov@nginx.com        self.assertEqual(
3381017Szelenkov@nginx.com            resp['headers']['X-Server-Name'],
3391017Szelenkov@nginx.com            'exmaple.com',
3401017Szelenkov@nginx.com            'Host port SERVER_NAME',
3411017Szelenkov@nginx.com        )
3421017Szelenkov@nginx.com        self.assertEqual(
3431017Szelenkov@nginx.com            resp['headers']['X-Http-Host'],
3441017Szelenkov@nginx.com            'exmaple.com:7080',
3451017Szelenkov@nginx.com            'Host port HTTP_HOST',
3461017Szelenkov@nginx.com        )
347973Szelenkov@nginx.com
348973Szelenkov@nginx.com    def test_http_header_host_port_empty(self):
349973Szelenkov@nginx.com        self.load('host')
350973Szelenkov@nginx.com
3511017Szelenkov@nginx.com        resp = self.get(
3521017Szelenkov@nginx.com            headers={'Host': 'exmaple.com:', 'Connection': 'close'}
3531017Szelenkov@nginx.com        )
354973Szelenkov@nginx.com
355973Szelenkov@nginx.com        self.assertEqual(resp['status'], 200, 'Host port empty status')
3561017Szelenkov@nginx.com        self.assertEqual(
3571017Szelenkov@nginx.com            resp['headers']['X-Server-Name'],
3581017Szelenkov@nginx.com            'exmaple.com',
3591017Szelenkov@nginx.com            'Host port empty SERVER_NAME',
3601017Szelenkov@nginx.com        )
3611017Szelenkov@nginx.com        self.assertEqual(
3621017Szelenkov@nginx.com            resp['headers']['X-Http-Host'],
3631017Szelenkov@nginx.com            'exmaple.com:',
3641017Szelenkov@nginx.com            'Host port empty HTTP_HOST',
3651017Szelenkov@nginx.com        )
366973Szelenkov@nginx.com
367973Szelenkov@nginx.com    def test_http_header_host_literal(self):
368973Szelenkov@nginx.com        self.load('host')
369973Szelenkov@nginx.com
3701017Szelenkov@nginx.com        resp = self.get(headers={'Host': '127.0.0.1', 'Connection': 'close'})
371973Szelenkov@nginx.com
372973Szelenkov@nginx.com        self.assertEqual(resp['status'], 200, 'Host literal status')
3731017Szelenkov@nginx.com        self.assertEqual(
3741017Szelenkov@nginx.com            resp['headers']['X-Server-Name'],
3751017Szelenkov@nginx.com            '127.0.0.1',
3761017Szelenkov@nginx.com            'Host literal SERVER_NAME',
3771017Szelenkov@nginx.com        )
378973Szelenkov@nginx.com
379973Szelenkov@nginx.com    def test_http_header_host_literal_ipv6(self):
380973Szelenkov@nginx.com        self.load('host')
381973Szelenkov@nginx.com
3821017Szelenkov@nginx.com        resp = self.get(headers={'Host': '[::1]:7080', 'Connection': 'close'})
383973Szelenkov@nginx.com
384973Szelenkov@nginx.com        self.assertEqual(resp['status'], 200, 'Host literal ipv6 status')
3851017Szelenkov@nginx.com        self.assertEqual(
3861017Szelenkov@nginx.com            resp['headers']['X-Server-Name'],
3871017Szelenkov@nginx.com            '[::1]',
3881017Szelenkov@nginx.com            'Host literal ipv6 SERVER_NAME',
3891017Szelenkov@nginx.com        )
3901017Szelenkov@nginx.com        self.assertEqual(
3911017Szelenkov@nginx.com            resp['headers']['X-Http-Host'],
3921017Szelenkov@nginx.com            '[::1]:7080',
3931017Szelenkov@nginx.com            'Host literal ipv6 HTTP_HOST',
3941017Szelenkov@nginx.com        )
395973Szelenkov@nginx.com
396973Szelenkov@nginx.com    def test_http_header_host_trailing_period(self):
397973Szelenkov@nginx.com        self.load('host')
398973Szelenkov@nginx.com
3991017Szelenkov@nginx.com        resp = self.get(headers={'Host': '127.0.0.1.', 'Connection': 'close'})
400973Szelenkov@nginx.com
401973Szelenkov@nginx.com        self.assertEqual(resp['status'], 200, 'Host trailing period status')
4021017Szelenkov@nginx.com        self.assertEqual(
4031017Szelenkov@nginx.com            resp['headers']['X-Server-Name'],
4041017Szelenkov@nginx.com            '127.0.0.1',
4051017Szelenkov@nginx.com            'Host trailing period SERVER_NAME',
4061017Szelenkov@nginx.com        )
4071017Szelenkov@nginx.com        self.assertEqual(
4081017Szelenkov@nginx.com            resp['headers']['X-Http-Host'],
4091017Szelenkov@nginx.com            '127.0.0.1.',
4101017Szelenkov@nginx.com            'Host trailing period HTTP_HOST',
4111017Szelenkov@nginx.com        )
412973Szelenkov@nginx.com
413973Szelenkov@nginx.com    def test_http_header_host_trailing_period_2(self):
414973Szelenkov@nginx.com        self.load('host')
415973Szelenkov@nginx.com
4161017Szelenkov@nginx.com        resp = self.get(
4171017Szelenkov@nginx.com            headers={'Host': 'EXAMPLE.COM.', 'Connection': 'close'}
4181017Szelenkov@nginx.com        )
419973Szelenkov@nginx.com
420973Szelenkov@nginx.com        self.assertEqual(resp['status'], 200, 'Host trailing period 2 status')
4211017Szelenkov@nginx.com        self.assertEqual(
4221017Szelenkov@nginx.com            resp['headers']['X-Server-Name'],
4231017Szelenkov@nginx.com            'example.com',
4241017Szelenkov@nginx.com            'Host trailing period 2 SERVER_NAME',
4251017Szelenkov@nginx.com        )
4261017Szelenkov@nginx.com        self.assertEqual(
4271017Szelenkov@nginx.com            resp['headers']['X-Http-Host'],
4281017Szelenkov@nginx.com            'EXAMPLE.COM.',
4291017Szelenkov@nginx.com            'Host trailing period 2 HTTP_HOST',
4301017Szelenkov@nginx.com        )
431973Szelenkov@nginx.com
432973Szelenkov@nginx.com    def test_http_header_host_case_insensitive(self):
433973Szelenkov@nginx.com        self.load('host')
434973Szelenkov@nginx.com
4351017Szelenkov@nginx.com        resp = self.get(headers={'Host': 'EXAMPLE.COM', 'Connection': 'close'})
436973Szelenkov@nginx.com
437973Szelenkov@nginx.com        self.assertEqual(resp['status'], 200, 'Host case insensitive')
4381017Szelenkov@nginx.com        self.assertEqual(
4391017Szelenkov@nginx.com            resp['headers']['X-Server-Name'],
4401017Szelenkov@nginx.com            'example.com',
4411017Szelenkov@nginx.com            'Host case insensitive SERVER_NAME',
4421017Szelenkov@nginx.com        )
443973Szelenkov@nginx.com
444973Szelenkov@nginx.com    def test_http_header_host_double_dot(self):
445973Szelenkov@nginx.com        self.load('empty')
446973Szelenkov@nginx.com
4471017Szelenkov@nginx.com        self.assertEqual(
4481017Szelenkov@nginx.com            self.get(headers={'Host': '127.0.0..1', 'Connection': 'close'})[
4491017Szelenkov@nginx.com                'status'
4501017Szelenkov@nginx.com            ],
4511017Szelenkov@nginx.com            400,
4521017Szelenkov@nginx.com            'Host double dot',
4531017Szelenkov@nginx.com        )
454973Szelenkov@nginx.com
455973Szelenkov@nginx.com    def test_http_header_host_slash(self):
456973Szelenkov@nginx.com        self.load('empty')
457973Szelenkov@nginx.com
4581017Szelenkov@nginx.com        self.assertEqual(
4591017Szelenkov@nginx.com            self.get(headers={'Host': '/localhost', 'Connection': 'close'})[
4601017Szelenkov@nginx.com                'status'
4611017Szelenkov@nginx.com            ],
4621017Szelenkov@nginx.com            400,
4631017Szelenkov@nginx.com            'Host slash',
4641017Szelenkov@nginx.com        )
465973Szelenkov@nginx.com
466973Szelenkov@nginx.com    def test_http_header_host_multiple_fields(self):
467973Szelenkov@nginx.com        self.load('empty')
468973Szelenkov@nginx.com
4691017Szelenkov@nginx.com        self.assertEqual(
4701017Szelenkov@nginx.com            self.get(
4711017Szelenkov@nginx.com                headers={
4721017Szelenkov@nginx.com                    'Host': ['localhost', 'example.com'],
4731017Szelenkov@nginx.com                    'Connection': 'close',
4741017Szelenkov@nginx.com                }
4751017Szelenkov@nginx.com            )['status'],
4761017Szelenkov@nginx.com            400,
4771017Szelenkov@nginx.com            'Host multiple fields',
4781017Szelenkov@nginx.com        )
4791017Szelenkov@nginx.com
480973Szelenkov@nginx.com
481578Szelenkov@nginx.comif __name__ == '__main__':
4821019Szelenkov@nginx.com    TestHTTPHeader.main()
483