1730Szelenkov@nginx.comimport time 2730Szelenkov@nginx.comimport socket 3730Szelenkov@nginx.comimport unittest 4730Szelenkov@nginx.comimport unit 5730Szelenkov@nginx.com 6730Szelenkov@nginx.comclass TestUnitSettings(unit.TestUnitApplicationPython): 7730Szelenkov@nginx.com 8730Szelenkov@nginx.com def setUpClass(): 9730Szelenkov@nginx.com unit.TestUnit().check_modules('python') 10730Szelenkov@nginx.com 11730Szelenkov@nginx.com def test_settings_header_read_timeout(self): 12730Szelenkov@nginx.com self.load('empty') 13730Szelenkov@nginx.com 14730Szelenkov@nginx.com self.conf({'http': { 'header_read_timeout': 2 }}, '/settings') 15730Szelenkov@nginx.com 16730Szelenkov@nginx.com (resp, sock) = self.http(b"""GET / HTTP/1.1 17730Szelenkov@nginx.com""", start=True, raw=True) 18730Szelenkov@nginx.com 19730Szelenkov@nginx.com time.sleep(3) 20730Szelenkov@nginx.com 21730Szelenkov@nginx.com resp = self.http(b"""Host: localhost 22730Szelenkov@nginx.comConnection: close 23730Szelenkov@nginx.com 24730Szelenkov@nginx.com""", sock=sock, raw=True) 25730Szelenkov@nginx.com 26730Szelenkov@nginx.com self.assertEqual(resp['status'], 408, 'status header read timeout') 27730Szelenkov@nginx.com 28756Szelenkov@nginx.com @unittest.expectedFailure 29756Szelenkov@nginx.com def test_settings_header_read_timeout_update(self): 30756Szelenkov@nginx.com self.load('empty') 31756Szelenkov@nginx.com 32756Szelenkov@nginx.com self.conf({'http': { 'header_read_timeout': 4 }}, '/settings') 33756Szelenkov@nginx.com 34756Szelenkov@nginx.com (resp, sock) = self.http(b"""GET / HTTP/1.1 35*759Szelenkov@nginx.com""", start=True, raw=True, no_recv=True) 36756Szelenkov@nginx.com 37756Szelenkov@nginx.com time.sleep(2) 38756Szelenkov@nginx.com 39756Szelenkov@nginx.com (resp, sock) = self.http(b"""Host: localhost 40*759Szelenkov@nginx.com""", start=True, sock=sock, raw=True, no_recv=True) 41*759Szelenkov@nginx.com 42*759Szelenkov@nginx.com time.sleep(2) 43*759Szelenkov@nginx.com 44*759Szelenkov@nginx.com (resp, sock) = self.http(b"""X-Blah: blah 45*759Szelenkov@nginx.com""", start=True, sock=sock, raw=True, no_recv=True) 46756Szelenkov@nginx.com 47756Szelenkov@nginx.com time.sleep(2) 48756Szelenkov@nginx.com 49756Szelenkov@nginx.com resp = self.http(b"""Connection: close 50756Szelenkov@nginx.com 51756Szelenkov@nginx.com""", sock=sock, raw=True) 52756Szelenkov@nginx.com 53756Szelenkov@nginx.com self.assertEqual(resp['status'], 408, 54756Szelenkov@nginx.com 'status header read timeout update') 55756Szelenkov@nginx.com 56730Szelenkov@nginx.com def test_settings_body_read_timeout(self): 57730Szelenkov@nginx.com self.load('empty') 58730Szelenkov@nginx.com 59730Szelenkov@nginx.com self.conf({'http': { 'body_read_timeout': 2 }}, '/settings') 60730Szelenkov@nginx.com 61730Szelenkov@nginx.com (resp, sock) = self.http(b"""POST / HTTP/1.1 62730Szelenkov@nginx.comHost: localhost 63730Szelenkov@nginx.comContent-Length: 10 64730Szelenkov@nginx.comConnection: close 65730Szelenkov@nginx.com 66730Szelenkov@nginx.com""", start=True, raw_resp=True, raw=True) 67730Szelenkov@nginx.com 68730Szelenkov@nginx.com time.sleep(3) 69730Szelenkov@nginx.com 70730Szelenkov@nginx.com resp = self.http(b"""0123456789""", sock=sock, raw=True) 71730Szelenkov@nginx.com 72730Szelenkov@nginx.com self.assertEqual(resp['status'], 408, 'status body read timeout') 73730Szelenkov@nginx.com 74756Szelenkov@nginx.com def test_settings_body_read_timeout_update(self): 75756Szelenkov@nginx.com self.load('empty') 76756Szelenkov@nginx.com 77756Szelenkov@nginx.com self.conf({'http': { 'body_read_timeout': 4 }}, '/settings') 78756Szelenkov@nginx.com 79756Szelenkov@nginx.com (resp, sock) = self.http(b"""POST / HTTP/1.1 80756Szelenkov@nginx.comHost: localhost 81756Szelenkov@nginx.comContent-Length: 10 82756Szelenkov@nginx.comConnection: close 83756Szelenkov@nginx.com 84756Szelenkov@nginx.com""", start=True, raw=True) 85756Szelenkov@nginx.com 86756Szelenkov@nginx.com time.sleep(2) 87756Szelenkov@nginx.com 88756Szelenkov@nginx.com (resp, sock) = self.http(b"""012""", start=True, sock=sock, raw=True) 89756Szelenkov@nginx.com 90756Szelenkov@nginx.com time.sleep(2) 91756Szelenkov@nginx.com 92756Szelenkov@nginx.com (resp, sock) = self.http(b"""345""", start=True, sock=sock, raw=True) 93756Szelenkov@nginx.com 94756Szelenkov@nginx.com time.sleep(2) 95756Szelenkov@nginx.com 96756Szelenkov@nginx.com resp = self.http(b"""6789""", sock=sock, raw=True) 97756Szelenkov@nginx.com 98756Szelenkov@nginx.com self.assertEqual(resp['status'], 200, 'status body read timeout update') 99756Szelenkov@nginx.com 100730Szelenkov@nginx.com def test_settings_send_timeout(self): 101730Szelenkov@nginx.com self.load('mirror') 102730Szelenkov@nginx.com 103730Szelenkov@nginx.com data_len = 1048576 104730Szelenkov@nginx.com 105730Szelenkov@nginx.com self.conf({'http': { 'send_timeout': 1 }}, '/settings') 106730Szelenkov@nginx.com 107730Szelenkov@nginx.com addr = self.testdir + '/sock' 108730Szelenkov@nginx.com 109730Szelenkov@nginx.com self.conf({"unix:" + addr: {'application': 'mirror'}}, '/listeners') 110730Szelenkov@nginx.com 111730Szelenkov@nginx.com sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) 112730Szelenkov@nginx.com sock.connect(addr) 113730Szelenkov@nginx.com 114730Szelenkov@nginx.com req = """POST / HTTP/1.1 115730Szelenkov@nginx.comHost: localhost 116730Szelenkov@nginx.comContent-Type: text/html 117730Szelenkov@nginx.comContent-Length: %d 118730Szelenkov@nginx.com 119730Szelenkov@nginx.com""" % data_len + ('X' * data_len) 120730Szelenkov@nginx.com 121730Szelenkov@nginx.com sock.sendall(req.encode()) 122730Szelenkov@nginx.com 123730Szelenkov@nginx.com data = sock.recv(16).decode() 124730Szelenkov@nginx.com 125730Szelenkov@nginx.com time.sleep(3) 126730Szelenkov@nginx.com 127738Szelenkov@nginx.com data += self.recvall(sock).decode() 128730Szelenkov@nginx.com 129730Szelenkov@nginx.com sock.close() 130730Szelenkov@nginx.com 131730Szelenkov@nginx.com self.assertRegex(data, r'200 OK', 'status send timeout') 132730Szelenkov@nginx.com self.assertLess(len(data), data_len, 'data send timeout') 133730Szelenkov@nginx.com 134730Szelenkov@nginx.com def test_settings_idle_timeout(self): 135730Szelenkov@nginx.com self.load('empty') 136730Szelenkov@nginx.com 137730Szelenkov@nginx.com self.conf({'http': { 'idle_timeout': 2 }}, '/settings') 138730Szelenkov@nginx.com 139730Szelenkov@nginx.com (resp, sock) = self.get(headers={ 140730Szelenkov@nginx.com 'Connection': 'keep-alive', 141730Szelenkov@nginx.com 'Host': 'localhost' 142730Szelenkov@nginx.com }, start=True) 143730Szelenkov@nginx.com 144730Szelenkov@nginx.com time.sleep(3) 145730Szelenkov@nginx.com 146730Szelenkov@nginx.com resp = self.get(headers={ 147730Szelenkov@nginx.com 'Connection': 'close', 148730Szelenkov@nginx.com 'Host': 'localhost' 149730Szelenkov@nginx.com }, sock=sock) 150730Szelenkov@nginx.com 151755Szelenkov@nginx.com self.assertEqual(resp['status'], 408, 'status idle timeout') 152730Szelenkov@nginx.com 153730Szelenkov@nginx.com def test_settings_max_body_size(self): 154730Szelenkov@nginx.com self.load('empty') 155730Szelenkov@nginx.com 156730Szelenkov@nginx.com self.conf({'http': { 'max_body_size': 5 }}, '/settings') 157730Szelenkov@nginx.com 158730Szelenkov@nginx.com self.assertEqual(self.post(body='01234')['status'], 200, 'status size') 159730Szelenkov@nginx.com self.assertEqual(self.post(body='012345')['status'], 413, 160730Szelenkov@nginx.com 'status size max') 161730Szelenkov@nginx.com 162730Szelenkov@nginx.com @unittest.expectedFailure 163730Szelenkov@nginx.com def test_settings_negative_value(self): 164730Szelenkov@nginx.com self.assertIn('error', self.conf({'http': { 'max_body_size': -1 }}, 165730Szelenkov@nginx.com '/settings'), 'settings negative value') 166730Szelenkov@nginx.com 167730Szelenkov@nginx.com 168730Szelenkov@nginx.comif __name__ == '__main__': 169730Szelenkov@nginx.com unittest.main() 170