xref: /unit/test/test_settings.py (revision 1613)
11596Szelenkov@nginx.comimport pytest
21477Szelenkov@nginx.comimport socket
3730Szelenkov@nginx.comimport time
41477Szelenkov@nginx.com
51019Szelenkov@nginx.comfrom unit.applications.lang.python import TestApplicationPython
61596Szelenkov@nginx.comimport re
7730Szelenkov@nginx.com
81017Szelenkov@nginx.com
91019Szelenkov@nginx.comclass TestSettings(TestApplicationPython):
101467Szelenkov@nginx.com    prerequisites = {'modules': {'python': 'any'}}
11730Szelenkov@nginx.com
12730Szelenkov@nginx.com    def test_settings_header_read_timeout(self):
13730Szelenkov@nginx.com        self.load('empty')
14730Szelenkov@nginx.com
151017Szelenkov@nginx.com        self.conf({'http': {'header_read_timeout': 2}}, 'settings')
16730Szelenkov@nginx.com
171017Szelenkov@nginx.com        (resp, sock) = self.http(
181017Szelenkov@nginx.com            b"""GET / HTTP/1.1
191017Szelenkov@nginx.com""",
201017Szelenkov@nginx.com            start=True,
211017Szelenkov@nginx.com            read_timeout=1,
221017Szelenkov@nginx.com            raw=True,
231017Szelenkov@nginx.com        )
24730Szelenkov@nginx.com
25730Szelenkov@nginx.com        time.sleep(3)
26730Szelenkov@nginx.com
271017Szelenkov@nginx.com        resp = self.http(
281017Szelenkov@nginx.com            b"""Host: localhost
29730Szelenkov@nginx.comConnection: close
30730Szelenkov@nginx.com
311017Szelenkov@nginx.com""",
321017Szelenkov@nginx.com            sock=sock,
331017Szelenkov@nginx.com            raw=True,
341017Szelenkov@nginx.com        )
35730Szelenkov@nginx.com
361596Szelenkov@nginx.com        assert resp['status'] == 408, 'status header read timeout'
37730Szelenkov@nginx.com
38756Szelenkov@nginx.com    def test_settings_header_read_timeout_update(self):
39756Szelenkov@nginx.com        self.load('empty')
40756Szelenkov@nginx.com
411017Szelenkov@nginx.com        self.conf({'http': {'header_read_timeout': 4}}, 'settings')
42756Szelenkov@nginx.com
431017Szelenkov@nginx.com        (resp, sock) = self.http(
441017Szelenkov@nginx.com            b"""GET / HTTP/1.1
451017Szelenkov@nginx.com""",
461017Szelenkov@nginx.com            start=True,
471017Szelenkov@nginx.com            raw=True,
481017Szelenkov@nginx.com            no_recv=True,
491017Szelenkov@nginx.com        )
50756Szelenkov@nginx.com
51756Szelenkov@nginx.com        time.sleep(2)
52756Szelenkov@nginx.com
531017Szelenkov@nginx.com        (resp, sock) = self.http(
541017Szelenkov@nginx.com            b"""Host: localhost
551017Szelenkov@nginx.com""",
561017Szelenkov@nginx.com            start=True,
571017Szelenkov@nginx.com            sock=sock,
581017Szelenkov@nginx.com            raw=True,
591017Szelenkov@nginx.com            no_recv=True,
601017Szelenkov@nginx.com        )
61759Szelenkov@nginx.com
62759Szelenkov@nginx.com        time.sleep(2)
63759Szelenkov@nginx.com
641017Szelenkov@nginx.com        (resp, sock) = self.http(
651017Szelenkov@nginx.com            b"""X-Blah: blah
661017Szelenkov@nginx.com""",
671017Szelenkov@nginx.com            start=True,
681017Szelenkov@nginx.com            sock=sock,
691017Szelenkov@nginx.com            read_timeout=1,
701017Szelenkov@nginx.com            raw=True,
711017Szelenkov@nginx.com        )
72767Szelenkov@nginx.com
73767Szelenkov@nginx.com        if len(resp) != 0:
74767Szelenkov@nginx.com            sock.close()
75756Szelenkov@nginx.com
76767Szelenkov@nginx.com        else:
77767Szelenkov@nginx.com            time.sleep(2)
78756Szelenkov@nginx.com
791017Szelenkov@nginx.com            resp = self.http(
801017Szelenkov@nginx.com                b"""Connection: close
81756Szelenkov@nginx.com
821017Szelenkov@nginx.com""",
831017Szelenkov@nginx.com                sock=sock,
841017Szelenkov@nginx.com                raw=True,
851017Szelenkov@nginx.com            )
86756Szelenkov@nginx.com
871596Szelenkov@nginx.com        assert resp['status'] == 408, 'status header read timeout update'
88756Szelenkov@nginx.com
89730Szelenkov@nginx.com    def test_settings_body_read_timeout(self):
90730Szelenkov@nginx.com        self.load('empty')
91730Szelenkov@nginx.com
921017Szelenkov@nginx.com        self.conf({'http': {'body_read_timeout': 2}}, 'settings')
93730Szelenkov@nginx.com
941017Szelenkov@nginx.com        (resp, sock) = self.http(
951017Szelenkov@nginx.com            b"""POST / HTTP/1.1
96730Szelenkov@nginx.comHost: localhost
97730Szelenkov@nginx.comContent-Length: 10
98730Szelenkov@nginx.comConnection: close
99730Szelenkov@nginx.com
1001017Szelenkov@nginx.com""",
1011017Szelenkov@nginx.com            start=True,
1021017Szelenkov@nginx.com            raw_resp=True,
1031017Szelenkov@nginx.com            read_timeout=1,
1041017Szelenkov@nginx.com            raw=True,
1051017Szelenkov@nginx.com        )
106730Szelenkov@nginx.com
107730Szelenkov@nginx.com        time.sleep(3)
108730Szelenkov@nginx.com
109730Szelenkov@nginx.com        resp = self.http(b"""0123456789""", sock=sock, raw=True)
110730Szelenkov@nginx.com
1111596Szelenkov@nginx.com        assert resp['status'] == 408, 'status body read timeout'
112730Szelenkov@nginx.com
113756Szelenkov@nginx.com    def test_settings_body_read_timeout_update(self):
114756Szelenkov@nginx.com        self.load('empty')
115756Szelenkov@nginx.com
1161017Szelenkov@nginx.com        self.conf({'http': {'body_read_timeout': 4}}, 'settings')
117756Szelenkov@nginx.com
1181017Szelenkov@nginx.com        (resp, sock) = self.http(
1191017Szelenkov@nginx.com            b"""POST / HTTP/1.1
120756Szelenkov@nginx.comHost: localhost
121756Szelenkov@nginx.comContent-Length: 10
122756Szelenkov@nginx.comConnection: close
123756Szelenkov@nginx.com
1241017Szelenkov@nginx.com""",
1251017Szelenkov@nginx.com            start=True,
1261017Szelenkov@nginx.com            read_timeout=1,
1271017Szelenkov@nginx.com            raw=True,
1281017Szelenkov@nginx.com        )
129756Szelenkov@nginx.com
130756Szelenkov@nginx.com        time.sleep(2)
131756Szelenkov@nginx.com
1321017Szelenkov@nginx.com        (resp, sock) = self.http(
1331017Szelenkov@nginx.com            b"""012""", start=True, sock=sock, read_timeout=1, raw=True
1341017Szelenkov@nginx.com        )
135756Szelenkov@nginx.com
136756Szelenkov@nginx.com        time.sleep(2)
137756Szelenkov@nginx.com
1381017Szelenkov@nginx.com        (resp, sock) = self.http(
1391017Szelenkov@nginx.com            b"""345""", start=True, sock=sock, read_timeout=1, raw=True
1401017Szelenkov@nginx.com        )
141756Szelenkov@nginx.com
142756Szelenkov@nginx.com        time.sleep(2)
143756Szelenkov@nginx.com
144756Szelenkov@nginx.com        resp = self.http(b"""6789""", sock=sock, raw=True)
145756Szelenkov@nginx.com
1461596Szelenkov@nginx.com        assert resp['status'] == 200, 'status body read timeout update'
147756Szelenkov@nginx.com
148730Szelenkov@nginx.com    def test_settings_send_timeout(self):
149730Szelenkov@nginx.com        self.load('mirror')
150730Szelenkov@nginx.com
151730Szelenkov@nginx.com        data_len = 1048576
152730Szelenkov@nginx.com
1531017Szelenkov@nginx.com        self.conf({'http': {'send_timeout': 1}}, 'settings')
154730Szelenkov@nginx.com
1551596Szelenkov@nginx.com        addr = self.temp_dir + '/sock'
156730Szelenkov@nginx.com
157760Szelenkov@nginx.com        self.conf({"unix:" + addr: {'application': 'mirror'}}, 'listeners')
158730Szelenkov@nginx.com
159730Szelenkov@nginx.com        sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
160730Szelenkov@nginx.com        sock.connect(addr)
161730Szelenkov@nginx.com
162730Szelenkov@nginx.com        req = """POST / HTTP/1.1
163730Szelenkov@nginx.comHost: localhost
164730Szelenkov@nginx.comContent-Type: text/html
165730Szelenkov@nginx.comContent-Length: %d
166970Szelenkov@nginx.comConnection: close
167730Szelenkov@nginx.com
1681017Szelenkov@nginx.com""" % data_len + (
1691017Szelenkov@nginx.com            'X' * data_len
1701017Szelenkov@nginx.com        )
171730Szelenkov@nginx.com
172730Szelenkov@nginx.com        sock.sendall(req.encode())
173730Szelenkov@nginx.com
174730Szelenkov@nginx.com        data = sock.recv(16).decode()
175730Szelenkov@nginx.com
176730Szelenkov@nginx.com        time.sleep(3)
177730Szelenkov@nginx.com
178738Szelenkov@nginx.com        data += self.recvall(sock).decode()
179730Szelenkov@nginx.com
180730Szelenkov@nginx.com        sock.close()
181730Szelenkov@nginx.com
1821596Szelenkov@nginx.com        assert re.search(r'200 OK', data), 'status send timeout'
1831596Szelenkov@nginx.com        assert len(data) < data_len, 'data send timeout'
184730Szelenkov@nginx.com
185730Szelenkov@nginx.com    def test_settings_idle_timeout(self):
186730Szelenkov@nginx.com        self.load('empty')
187730Szelenkov@nginx.com
1881596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'init'
1891029Szelenkov@nginx.com
1901017Szelenkov@nginx.com        self.conf({'http': {'idle_timeout': 2}}, 'settings')
191730Szelenkov@nginx.com
1921017Szelenkov@nginx.com        (resp, sock) = self.get(
1931017Szelenkov@nginx.com            headers={'Host': 'localhost', 'Connection': 'keep-alive'},
1941017Szelenkov@nginx.com            start=True,
1951017Szelenkov@nginx.com            read_timeout=1,
1961017Szelenkov@nginx.com        )
197730Szelenkov@nginx.com
198730Szelenkov@nginx.com        time.sleep(3)
199730Szelenkov@nginx.com
2001017Szelenkov@nginx.com        resp = self.get(
2011017Szelenkov@nginx.com            headers={'Host': 'localhost', 'Connection': 'close'}, sock=sock
2021017Szelenkov@nginx.com        )
203730Szelenkov@nginx.com
2041596Szelenkov@nginx.com        assert resp['status'] == 408, 'status idle timeout'
205730Szelenkov@nginx.com
2061606Szelenkov@nginx.com    def test_settings_idle_timeout_2(self):
2071606Szelenkov@nginx.com        self.load('empty')
2081606Szelenkov@nginx.com
2091606Szelenkov@nginx.com        assert self.get()['status'] == 200, 'init'
2101606Szelenkov@nginx.com
2111606Szelenkov@nginx.com        self.conf({'http': {'idle_timeout': 1}}, 'settings')
2121606Szelenkov@nginx.com
2131606Szelenkov@nginx.com        _, sock = self.http(b'', start=True, raw=True, no_recv=True)
2141606Szelenkov@nginx.com
215*1613Szelenkov@nginx.com        time.sleep(3)
2161606Szelenkov@nginx.com
2171606Szelenkov@nginx.com        assert (
2181606Szelenkov@nginx.com            self.get(
2191606Szelenkov@nginx.com                headers={'Host': 'localhost', 'Connection': 'close'}, sock=sock
2201606Szelenkov@nginx.com            )['status']
2211606Szelenkov@nginx.com            == 408
2221606Szelenkov@nginx.com        ), 'status idle timeout'
2231606Szelenkov@nginx.com
224730Szelenkov@nginx.com    def test_settings_max_body_size(self):
225730Szelenkov@nginx.com        self.load('empty')
226730Szelenkov@nginx.com
2271017Szelenkov@nginx.com        self.conf({'http': {'max_body_size': 5}}, 'settings')
228730Szelenkov@nginx.com
2291596Szelenkov@nginx.com        assert self.post(body='01234')['status'] == 200, 'status size'
2301596Szelenkov@nginx.com        assert self.post(body='012345')['status'] == 413, 'status size max'
231730Szelenkov@nginx.com
2321365Szelenkov@nginx.com    def test_settings_max_body_size_large(self):
2331365Szelenkov@nginx.com        self.load('mirror')
2341365Szelenkov@nginx.com
2351365Szelenkov@nginx.com        self.conf({'http': {'max_body_size': 32 * 1024 * 1024}}, 'settings')
2361365Szelenkov@nginx.com
2371365Szelenkov@nginx.com        body = '0123456789abcdef' * 4 * 64 * 1024
2381365Szelenkov@nginx.com        resp = self.post(body=body, read_buffer_size=1024 * 1024)
2391596Szelenkov@nginx.com        assert resp['status'] == 200, 'status size 4'
2401596Szelenkov@nginx.com        assert resp['body'] == body, 'status body 4'
2411365Szelenkov@nginx.com
2421365Szelenkov@nginx.com        body = '0123456789abcdef' * 8 * 64 * 1024
2431365Szelenkov@nginx.com        resp = self.post(body=body, read_buffer_size=1024 * 1024)
2441596Szelenkov@nginx.com        assert resp['status'] == 200, 'status size 8'
2451596Szelenkov@nginx.com        assert resp['body'] == body, 'status body 8'
2461365Szelenkov@nginx.com
2471365Szelenkov@nginx.com        body = '0123456789abcdef' * 16 * 64 * 1024
2481365Szelenkov@nginx.com        resp = self.post(body=body, read_buffer_size=1024 * 1024)
2491596Szelenkov@nginx.com        assert resp['status'] == 200, 'status size 16'
2501596Szelenkov@nginx.com        assert resp['body'] == body, 'status body 16'
2511365Szelenkov@nginx.com
2521365Szelenkov@nginx.com        body = '0123456789abcdef' * 32 * 64 * 1024
2531365Szelenkov@nginx.com        resp = self.post(body=body, read_buffer_size=1024 * 1024)
2541596Szelenkov@nginx.com        assert resp['status'] == 200, 'status size 32'
2551596Szelenkov@nginx.com        assert resp['body'] == body, 'status body 32'
2561365Szelenkov@nginx.com
2571596Szelenkov@nginx.com    @pytest.mark.skip('not yet')
258730Szelenkov@nginx.com    def test_settings_negative_value(self):
2591596Szelenkov@nginx.com        assert 'error' in self.conf(
2601596Szelenkov@nginx.com            {'http': {'max_body_size': -1}}, 'settings'
2611596Szelenkov@nginx.com        ), 'settings negative value'
262