xref: /unit/test/test_settings.py (revision 1877)
11635Szelenkov@nginx.comimport re
21477Szelenkov@nginx.comimport socket
3730Szelenkov@nginx.comimport time
41477Szelenkov@nginx.com
51635Szelenkov@nginx.comimport pytest
61848Szelenkov@nginx.com
71019Szelenkov@nginx.comfrom unit.applications.lang.python import TestApplicationPython
8*1877Szelenkov@nginx.comfrom unit.utils import sysctl
9730Szelenkov@nginx.com
101017Szelenkov@nginx.com
111019Szelenkov@nginx.comclass TestSettings(TestApplicationPython):
121467Szelenkov@nginx.com    prerequisites = {'modules': {'python': 'any'}}
13730Szelenkov@nginx.com
14730Szelenkov@nginx.com    def test_settings_header_read_timeout(self):
15730Szelenkov@nginx.com        self.load('empty')
16730Szelenkov@nginx.com
171017Szelenkov@nginx.com        self.conf({'http': {'header_read_timeout': 2}}, 'settings')
18730Szelenkov@nginx.com
191017Szelenkov@nginx.com        (resp, sock) = self.http(
201017Szelenkov@nginx.com            b"""GET / HTTP/1.1
211017Szelenkov@nginx.com""",
221017Szelenkov@nginx.com            start=True,
231017Szelenkov@nginx.com            read_timeout=1,
241017Szelenkov@nginx.com            raw=True,
251017Szelenkov@nginx.com        )
26730Szelenkov@nginx.com
27730Szelenkov@nginx.com        time.sleep(3)
28730Szelenkov@nginx.com
291017Szelenkov@nginx.com        resp = self.http(
301017Szelenkov@nginx.com            b"""Host: localhost
31730Szelenkov@nginx.comConnection: close
32730Szelenkov@nginx.com
331017Szelenkov@nginx.com""",
341017Szelenkov@nginx.com            sock=sock,
351017Szelenkov@nginx.com            raw=True,
361017Szelenkov@nginx.com        )
37730Szelenkov@nginx.com
381596Szelenkov@nginx.com        assert resp['status'] == 408, 'status header read timeout'
39730Szelenkov@nginx.com
40756Szelenkov@nginx.com    def test_settings_header_read_timeout_update(self):
41756Szelenkov@nginx.com        self.load('empty')
42756Szelenkov@nginx.com
431017Szelenkov@nginx.com        self.conf({'http': {'header_read_timeout': 4}}, 'settings')
44756Szelenkov@nginx.com
451017Szelenkov@nginx.com        (resp, sock) = self.http(
461017Szelenkov@nginx.com            b"""GET / HTTP/1.1
471017Szelenkov@nginx.com""",
481017Szelenkov@nginx.com            start=True,
491017Szelenkov@nginx.com            raw=True,
501017Szelenkov@nginx.com            no_recv=True,
511017Szelenkov@nginx.com        )
52756Szelenkov@nginx.com
53756Szelenkov@nginx.com        time.sleep(2)
54756Szelenkov@nginx.com
551017Szelenkov@nginx.com        (resp, sock) = self.http(
561017Szelenkov@nginx.com            b"""Host: localhost
571017Szelenkov@nginx.com""",
581017Szelenkov@nginx.com            start=True,
591017Szelenkov@nginx.com            sock=sock,
601017Szelenkov@nginx.com            raw=True,
611017Szelenkov@nginx.com            no_recv=True,
621017Szelenkov@nginx.com        )
63759Szelenkov@nginx.com
64759Szelenkov@nginx.com        time.sleep(2)
65759Szelenkov@nginx.com
661017Szelenkov@nginx.com        (resp, sock) = self.http(
671017Szelenkov@nginx.com            b"""X-Blah: blah
681017Szelenkov@nginx.com""",
691017Szelenkov@nginx.com            start=True,
701017Szelenkov@nginx.com            sock=sock,
711017Szelenkov@nginx.com            read_timeout=1,
721017Szelenkov@nginx.com            raw=True,
731017Szelenkov@nginx.com        )
74767Szelenkov@nginx.com
75767Szelenkov@nginx.com        if len(resp) != 0:
76767Szelenkov@nginx.com            sock.close()
77756Szelenkov@nginx.com
78767Szelenkov@nginx.com        else:
79767Szelenkov@nginx.com            time.sleep(2)
80756Szelenkov@nginx.com
811017Szelenkov@nginx.com            resp = self.http(
821017Szelenkov@nginx.com                b"""Connection: close
83756Szelenkov@nginx.com
841017Szelenkov@nginx.com""",
851017Szelenkov@nginx.com                sock=sock,
861017Szelenkov@nginx.com                raw=True,
871017Szelenkov@nginx.com            )
88756Szelenkov@nginx.com
891596Szelenkov@nginx.com        assert resp['status'] == 408, 'status header read timeout update'
90756Szelenkov@nginx.com
91730Szelenkov@nginx.com    def test_settings_body_read_timeout(self):
92730Szelenkov@nginx.com        self.load('empty')
93730Szelenkov@nginx.com
941017Szelenkov@nginx.com        self.conf({'http': {'body_read_timeout': 2}}, 'settings')
95730Szelenkov@nginx.com
961017Szelenkov@nginx.com        (resp, sock) = self.http(
971017Szelenkov@nginx.com            b"""POST / HTTP/1.1
98730Szelenkov@nginx.comHost: localhost
99730Szelenkov@nginx.comContent-Length: 10
100730Szelenkov@nginx.comConnection: close
101730Szelenkov@nginx.com
1021017Szelenkov@nginx.com""",
1031017Szelenkov@nginx.com            start=True,
1041017Szelenkov@nginx.com            raw_resp=True,
1051017Szelenkov@nginx.com            read_timeout=1,
1061017Szelenkov@nginx.com            raw=True,
1071017Szelenkov@nginx.com        )
108730Szelenkov@nginx.com
109730Szelenkov@nginx.com        time.sleep(3)
110730Szelenkov@nginx.com
111730Szelenkov@nginx.com        resp = self.http(b"""0123456789""", sock=sock, raw=True)
112730Szelenkov@nginx.com
1131596Szelenkov@nginx.com        assert resp['status'] == 408, 'status body read timeout'
114730Szelenkov@nginx.com
115756Szelenkov@nginx.com    def test_settings_body_read_timeout_update(self):
116756Szelenkov@nginx.com        self.load('empty')
117756Szelenkov@nginx.com
1181017Szelenkov@nginx.com        self.conf({'http': {'body_read_timeout': 4}}, 'settings')
119756Szelenkov@nginx.com
1201017Szelenkov@nginx.com        (resp, sock) = self.http(
1211017Szelenkov@nginx.com            b"""POST / HTTP/1.1
122756Szelenkov@nginx.comHost: localhost
123756Szelenkov@nginx.comContent-Length: 10
124756Szelenkov@nginx.comConnection: close
125756Szelenkov@nginx.com
1261017Szelenkov@nginx.com""",
1271017Szelenkov@nginx.com            start=True,
1281017Szelenkov@nginx.com            read_timeout=1,
1291017Szelenkov@nginx.com            raw=True,
1301017Szelenkov@nginx.com        )
131756Szelenkov@nginx.com
132756Szelenkov@nginx.com        time.sleep(2)
133756Szelenkov@nginx.com
1341017Szelenkov@nginx.com        (resp, sock) = self.http(
1351017Szelenkov@nginx.com            b"""012""", start=True, sock=sock, read_timeout=1, raw=True
1361017Szelenkov@nginx.com        )
137756Szelenkov@nginx.com
138756Szelenkov@nginx.com        time.sleep(2)
139756Szelenkov@nginx.com
1401017Szelenkov@nginx.com        (resp, sock) = self.http(
1411017Szelenkov@nginx.com            b"""345""", start=True, sock=sock, read_timeout=1, raw=True
1421017Szelenkov@nginx.com        )
143756Szelenkov@nginx.com
144756Szelenkov@nginx.com        time.sleep(2)
145756Szelenkov@nginx.com
146756Szelenkov@nginx.com        resp = self.http(b"""6789""", sock=sock, raw=True)
147756Szelenkov@nginx.com
1481596Szelenkov@nginx.com        assert resp['status'] == 200, 'status body read timeout update'
149756Szelenkov@nginx.com
1501654Szelenkov@nginx.com    def test_settings_send_timeout(self, temp_dir):
151*1877Szelenkov@nginx.com        self.load('body_generate')
152730Szelenkov@nginx.com
153*1877Szelenkov@nginx.com        sysctl_out = sysctl()
154*1877Szelenkov@nginx.com        values = re.findall(
155*1877Szelenkov@nginx.com            r'net.core.[rw]mem_(?:max|default).*?(\d+)', sysctl_out
156*1877Szelenkov@nginx.com        )
157*1877Szelenkov@nginx.com        values = [int(v) for v in values]
158*1877Szelenkov@nginx.com
159*1877Szelenkov@nginx.com        data_len = 1048576 if len(values) == 0 else 10 * max(values)
160730Szelenkov@nginx.com
1611017Szelenkov@nginx.com        self.conf({'http': {'send_timeout': 1}}, 'settings')
162730Szelenkov@nginx.com
1631654Szelenkov@nginx.com        addr = temp_dir + '/sock'
164730Szelenkov@nginx.com
165*1877Szelenkov@nginx.com        self.conf(
166*1877Szelenkov@nginx.com            {"unix:" + addr: {'application': 'body_generate'}}, 'listeners'
167*1877Szelenkov@nginx.com        )
168730Szelenkov@nginx.com
169730Szelenkov@nginx.com        sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
170730Szelenkov@nginx.com        sock.connect(addr)
171730Szelenkov@nginx.com
172*1877Szelenkov@nginx.com        req = (
173*1877Szelenkov@nginx.com            """GET / HTTP/1.1
174730Szelenkov@nginx.comHost: localhost
175*1877Szelenkov@nginx.comX-Length: %d
176970Szelenkov@nginx.comConnection: close
177730Szelenkov@nginx.com
178*1877Szelenkov@nginx.com"""
179*1877Szelenkov@nginx.com            % data_len
1801017Szelenkov@nginx.com        )
181730Szelenkov@nginx.com
182730Szelenkov@nginx.com        sock.sendall(req.encode())
183730Szelenkov@nginx.com
184730Szelenkov@nginx.com        data = sock.recv(16).decode()
185730Szelenkov@nginx.com
186730Szelenkov@nginx.com        time.sleep(3)
187730Szelenkov@nginx.com
188738Szelenkov@nginx.com        data += self.recvall(sock).decode()
189730Szelenkov@nginx.com
190730Szelenkov@nginx.com        sock.close()
191730Szelenkov@nginx.com
1921596Szelenkov@nginx.com        assert re.search(r'200 OK', data), 'status send timeout'
1931596Szelenkov@nginx.com        assert len(data) < data_len, 'data send timeout'
194730Szelenkov@nginx.com
195730Szelenkov@nginx.com    def test_settings_idle_timeout(self):
196730Szelenkov@nginx.com        self.load('empty')
197730Szelenkov@nginx.com
1981596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'init'
1991029Szelenkov@nginx.com
2001017Szelenkov@nginx.com        self.conf({'http': {'idle_timeout': 2}}, 'settings')
201730Szelenkov@nginx.com
2021017Szelenkov@nginx.com        (resp, sock) = self.get(
2031017Szelenkov@nginx.com            headers={'Host': 'localhost', 'Connection': 'keep-alive'},
2041017Szelenkov@nginx.com            start=True,
2051017Szelenkov@nginx.com            read_timeout=1,
2061017Szelenkov@nginx.com        )
207730Szelenkov@nginx.com
208730Szelenkov@nginx.com        time.sleep(3)
209730Szelenkov@nginx.com
2101017Szelenkov@nginx.com        resp = self.get(
2111017Szelenkov@nginx.com            headers={'Host': 'localhost', 'Connection': 'close'}, sock=sock
2121017Szelenkov@nginx.com        )
213730Szelenkov@nginx.com
2141596Szelenkov@nginx.com        assert resp['status'] == 408, 'status idle timeout'
215730Szelenkov@nginx.com
2161606Szelenkov@nginx.com    def test_settings_idle_timeout_2(self):
2171606Szelenkov@nginx.com        self.load('empty')
2181606Szelenkov@nginx.com
2191606Szelenkov@nginx.com        assert self.get()['status'] == 200, 'init'
2201606Szelenkov@nginx.com
2211606Szelenkov@nginx.com        self.conf({'http': {'idle_timeout': 1}}, 'settings')
2221606Szelenkov@nginx.com
2231606Szelenkov@nginx.com        _, sock = self.http(b'', start=True, raw=True, no_recv=True)
2241606Szelenkov@nginx.com
2251613Szelenkov@nginx.com        time.sleep(3)
2261606Szelenkov@nginx.com
2271606Szelenkov@nginx.com        assert (
2281606Szelenkov@nginx.com            self.get(
2291606Szelenkov@nginx.com                headers={'Host': 'localhost', 'Connection': 'close'}, sock=sock
2301606Szelenkov@nginx.com            )['status']
2311606Szelenkov@nginx.com            == 408
2321606Szelenkov@nginx.com        ), 'status idle timeout'
2331606Szelenkov@nginx.com
234730Szelenkov@nginx.com    def test_settings_max_body_size(self):
235730Szelenkov@nginx.com        self.load('empty')
236730Szelenkov@nginx.com
2371017Szelenkov@nginx.com        self.conf({'http': {'max_body_size': 5}}, 'settings')
238730Szelenkov@nginx.com
2391596Szelenkov@nginx.com        assert self.post(body='01234')['status'] == 200, 'status size'
2401596Szelenkov@nginx.com        assert self.post(body='012345')['status'] == 413, 'status size max'
241730Szelenkov@nginx.com
2421365Szelenkov@nginx.com    def test_settings_max_body_size_large(self):
2431365Szelenkov@nginx.com        self.load('mirror')
2441365Szelenkov@nginx.com
2451365Szelenkov@nginx.com        self.conf({'http': {'max_body_size': 32 * 1024 * 1024}}, 'settings')
2461365Szelenkov@nginx.com
2471365Szelenkov@nginx.com        body = '0123456789abcdef' * 4 * 64 * 1024
2481365Szelenkov@nginx.com        resp = self.post(body=body, read_buffer_size=1024 * 1024)
2491596Szelenkov@nginx.com        assert resp['status'] == 200, 'status size 4'
2501596Szelenkov@nginx.com        assert resp['body'] == body, 'status body 4'
2511365Szelenkov@nginx.com
2521365Szelenkov@nginx.com        body = '0123456789abcdef' * 8 * 64 * 1024
2531365Szelenkov@nginx.com        resp = self.post(body=body, read_buffer_size=1024 * 1024)
2541596Szelenkov@nginx.com        assert resp['status'] == 200, 'status size 8'
2551596Szelenkov@nginx.com        assert resp['body'] == body, 'status body 8'
2561365Szelenkov@nginx.com
2571365Szelenkov@nginx.com        body = '0123456789abcdef' * 16 * 64 * 1024
2581365Szelenkov@nginx.com        resp = self.post(body=body, read_buffer_size=1024 * 1024)
2591596Szelenkov@nginx.com        assert resp['status'] == 200, 'status size 16'
2601596Szelenkov@nginx.com        assert resp['body'] == body, 'status body 16'
2611365Szelenkov@nginx.com
2621365Szelenkov@nginx.com        body = '0123456789abcdef' * 32 * 64 * 1024
2631365Szelenkov@nginx.com        resp = self.post(body=body, read_buffer_size=1024 * 1024)
2641596Szelenkov@nginx.com        assert resp['status'] == 200, 'status size 32'
2651596Szelenkov@nginx.com        assert resp['body'] == body, 'status body 32'
2661365Szelenkov@nginx.com
2671596Szelenkov@nginx.com    @pytest.mark.skip('not yet')
268730Szelenkov@nginx.com    def test_settings_negative_value(self):
2691596Szelenkov@nginx.com        assert 'error' in self.conf(
2701596Szelenkov@nginx.com            {'http': {'max_body_size': -1}}, 'settings'
2711596Szelenkov@nginx.com        ), 'settings negative value'
2721702Szelenkov@nginx.com
2731702Szelenkov@nginx.com    def test_settings_body_buffer_size(self):
2741702Szelenkov@nginx.com        self.load('mirror')
2751702Szelenkov@nginx.com
2761702Szelenkov@nginx.com        assert 'success' in self.conf(
2771702Szelenkov@nginx.com            {
2781702Szelenkov@nginx.com                'http': {
2791702Szelenkov@nginx.com                    'max_body_size': 64 * 1024 * 1024,
2801702Szelenkov@nginx.com                    'body_buffer_size': 32 * 1024 * 1024,
2811702Szelenkov@nginx.com                }
2821702Szelenkov@nginx.com            },
2831702Szelenkov@nginx.com            'settings',
2841702Szelenkov@nginx.com        )
2851702Szelenkov@nginx.com
2861702Szelenkov@nginx.com        body = '0123456789abcdef'
2871702Szelenkov@nginx.com        resp = self.post(body=body)
2881702Szelenkov@nginx.com        assert bool(resp), 'response from application'
2891702Szelenkov@nginx.com        assert resp['status'] == 200, 'status'
2901702Szelenkov@nginx.com        assert resp['body'] == body, 'body'
2911702Szelenkov@nginx.com
2921702Szelenkov@nginx.com        body = '0123456789abcdef' * 1024 * 1024
2931702Szelenkov@nginx.com        resp = self.post(body=body, read_buffer_size=1024 * 1024)
2941702Szelenkov@nginx.com        assert bool(resp), 'response from application 2'
2951702Szelenkov@nginx.com        assert resp['status'] == 200, 'status 2'
2961702Szelenkov@nginx.com        assert resp['body'] == body, 'body 2'
2971702Szelenkov@nginx.com
2981702Szelenkov@nginx.com        body = '0123456789abcdef' * 2 * 1024 * 1024
2991702Szelenkov@nginx.com        resp = self.post(body=body, read_buffer_size=1024 * 1024)
3001702Szelenkov@nginx.com        assert bool(resp), 'response from application 3'
3011702Szelenkov@nginx.com        assert resp['status'] == 200, 'status 3'
3021702Szelenkov@nginx.com        assert resp['body'] == body, 'body 3'
3031702Szelenkov@nginx.com
3041702Szelenkov@nginx.com        body = '0123456789abcdef' * 3 * 1024 * 1024
3051702Szelenkov@nginx.com        resp = self.post(body=body, read_buffer_size=1024 * 1024)
3061702Szelenkov@nginx.com        assert bool(resp), 'response from application 4'
3071702Szelenkov@nginx.com        assert resp['status'] == 200, 'status 4'
3081702Szelenkov@nginx.com        assert resp['body'] == body, 'body 4'
309