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 28*756Szelenkov@nginx.com @unittest.expectedFailure 29*756Szelenkov@nginx.com def test_settings_header_read_timeout_update(self): 30*756Szelenkov@nginx.com self.load('empty') 31*756Szelenkov@nginx.com 32*756Szelenkov@nginx.com self.conf({'http': { 'header_read_timeout': 4 }}, '/settings') 33*756Szelenkov@nginx.com 34*756Szelenkov@nginx.com (resp, sock) = self.http(b"""GET / HTTP/1.1 35*756Szelenkov@nginx.com""", start=True, raw=True) 36*756Szelenkov@nginx.com 37*756Szelenkov@nginx.com time.sleep(2) 38*756Szelenkov@nginx.com 39*756Szelenkov@nginx.com (resp, sock) = self.http(b"""Host: localhost 40*756Szelenkov@nginx.com""", start=True, sock=sock, raw=True) 41*756Szelenkov@nginx.com 42*756Szelenkov@nginx.com time.sleep(2) 43*756Szelenkov@nginx.com 44*756Szelenkov@nginx.com resp = self.http(b"""Connection: close 45*756Szelenkov@nginx.com 46*756Szelenkov@nginx.com""", sock=sock, raw=True) 47*756Szelenkov@nginx.com 48*756Szelenkov@nginx.com time.sleep(2) 49*756Szelenkov@nginx.com 50*756Szelenkov@nginx.com self.assertEqual(resp['status'], 408, 51*756Szelenkov@nginx.com 'status header read timeout update') 52*756Szelenkov@nginx.com 53730Szelenkov@nginx.com def test_settings_body_read_timeout(self): 54730Szelenkov@nginx.com self.load('empty') 55730Szelenkov@nginx.com 56730Szelenkov@nginx.com self.conf({'http': { 'body_read_timeout': 2 }}, '/settings') 57730Szelenkov@nginx.com 58730Szelenkov@nginx.com (resp, sock) = self.http(b"""POST / HTTP/1.1 59730Szelenkov@nginx.comHost: localhost 60730Szelenkov@nginx.comContent-Length: 10 61730Szelenkov@nginx.comConnection: close 62730Szelenkov@nginx.com 63730Szelenkov@nginx.com""", start=True, raw_resp=True, raw=True) 64730Szelenkov@nginx.com 65730Szelenkov@nginx.com time.sleep(3) 66730Szelenkov@nginx.com 67730Szelenkov@nginx.com resp = self.http(b"""0123456789""", sock=sock, raw=True) 68730Szelenkov@nginx.com 69730Szelenkov@nginx.com self.assertEqual(resp['status'], 408, 'status body read timeout') 70730Szelenkov@nginx.com 71*756Szelenkov@nginx.com def test_settings_body_read_timeout_update(self): 72*756Szelenkov@nginx.com self.load('empty') 73*756Szelenkov@nginx.com 74*756Szelenkov@nginx.com self.conf({'http': { 'body_read_timeout': 4 }}, '/settings') 75*756Szelenkov@nginx.com 76*756Szelenkov@nginx.com (resp, sock) = self.http(b"""POST / HTTP/1.1 77*756Szelenkov@nginx.comHost: localhost 78*756Szelenkov@nginx.comContent-Length: 10 79*756Szelenkov@nginx.comConnection: close 80*756Szelenkov@nginx.com 81*756Szelenkov@nginx.com""", start=True, raw=True) 82*756Szelenkov@nginx.com 83*756Szelenkov@nginx.com time.sleep(2) 84*756Szelenkov@nginx.com 85*756Szelenkov@nginx.com (resp, sock) = self.http(b"""012""", start=True, sock=sock, raw=True) 86*756Szelenkov@nginx.com 87*756Szelenkov@nginx.com time.sleep(2) 88*756Szelenkov@nginx.com 89*756Szelenkov@nginx.com (resp, sock) = self.http(b"""345""", start=True, sock=sock, raw=True) 90*756Szelenkov@nginx.com 91*756Szelenkov@nginx.com time.sleep(2) 92*756Szelenkov@nginx.com 93*756Szelenkov@nginx.com resp = self.http(b"""6789""", sock=sock, raw=True) 94*756Szelenkov@nginx.com 95*756Szelenkov@nginx.com self.assertEqual(resp['status'], 200, 'status body read timeout update') 96*756Szelenkov@nginx.com 97730Szelenkov@nginx.com def test_settings_send_timeout(self): 98730Szelenkov@nginx.com self.load('mirror') 99730Szelenkov@nginx.com 100730Szelenkov@nginx.com data_len = 1048576 101730Szelenkov@nginx.com 102730Szelenkov@nginx.com self.conf({'http': { 'send_timeout': 1 }}, '/settings') 103730Szelenkov@nginx.com 104730Szelenkov@nginx.com addr = self.testdir + '/sock' 105730Szelenkov@nginx.com 106730Szelenkov@nginx.com self.conf({"unix:" + addr: {'application': 'mirror'}}, '/listeners') 107730Szelenkov@nginx.com 108730Szelenkov@nginx.com sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) 109730Szelenkov@nginx.com sock.connect(addr) 110730Szelenkov@nginx.com 111730Szelenkov@nginx.com req = """POST / HTTP/1.1 112730Szelenkov@nginx.comHost: localhost 113730Szelenkov@nginx.comContent-Type: text/html 114730Szelenkov@nginx.comContent-Length: %d 115730Szelenkov@nginx.com 116730Szelenkov@nginx.com""" % data_len + ('X' * data_len) 117730Szelenkov@nginx.com 118730Szelenkov@nginx.com sock.sendall(req.encode()) 119730Szelenkov@nginx.com 120730Szelenkov@nginx.com data = sock.recv(16).decode() 121730Szelenkov@nginx.com 122730Szelenkov@nginx.com time.sleep(3) 123730Szelenkov@nginx.com 124738Szelenkov@nginx.com data += self.recvall(sock).decode() 125730Szelenkov@nginx.com 126730Szelenkov@nginx.com sock.close() 127730Szelenkov@nginx.com 128730Szelenkov@nginx.com self.assertRegex(data, r'200 OK', 'status send timeout') 129730Szelenkov@nginx.com self.assertLess(len(data), data_len, 'data send timeout') 130730Szelenkov@nginx.com 131730Szelenkov@nginx.com def test_settings_idle_timeout(self): 132730Szelenkov@nginx.com self.load('empty') 133730Szelenkov@nginx.com 134730Szelenkov@nginx.com self.conf({'http': { 'idle_timeout': 2 }}, '/settings') 135730Szelenkov@nginx.com 136730Szelenkov@nginx.com (resp, sock) = self.get(headers={ 137730Szelenkov@nginx.com 'Connection': 'keep-alive', 138730Szelenkov@nginx.com 'Host': 'localhost' 139730Szelenkov@nginx.com }, start=True) 140730Szelenkov@nginx.com 141730Szelenkov@nginx.com time.sleep(3) 142730Szelenkov@nginx.com 143730Szelenkov@nginx.com resp = self.get(headers={ 144730Szelenkov@nginx.com 'Connection': 'close', 145730Szelenkov@nginx.com 'Host': 'localhost' 146730Szelenkov@nginx.com }, sock=sock) 147730Szelenkov@nginx.com 148755Szelenkov@nginx.com self.assertEqual(resp['status'], 408, 'status idle timeout') 149730Szelenkov@nginx.com 150730Szelenkov@nginx.com def test_settings_max_body_size(self): 151730Szelenkov@nginx.com self.load('empty') 152730Szelenkov@nginx.com 153730Szelenkov@nginx.com self.conf({'http': { 'max_body_size': 5 }}, '/settings') 154730Szelenkov@nginx.com 155730Szelenkov@nginx.com self.assertEqual(self.post(body='01234')['status'], 200, 'status size') 156730Szelenkov@nginx.com self.assertEqual(self.post(body='012345')['status'], 413, 157730Szelenkov@nginx.com 'status size max') 158730Szelenkov@nginx.com 159730Szelenkov@nginx.com @unittest.expectedFailure 160730Szelenkov@nginx.com def test_settings_negative_value(self): 161730Szelenkov@nginx.com self.assertIn('error', self.conf({'http': { 'max_body_size': -1 }}, 162730Szelenkov@nginx.com '/settings'), 'settings negative value') 163730Szelenkov@nginx.com 164730Szelenkov@nginx.com 165730Szelenkov@nginx.comif __name__ == '__main__': 166730Szelenkov@nginx.com unittest.main() 167