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 14760Szelenkov@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 def test_settings_header_read_timeout_update(self): 29756Szelenkov@nginx.com self.load('empty') 30756Szelenkov@nginx.com 31*767Szelenkov@nginx.com r = None 32*767Szelenkov@nginx.com 33760Szelenkov@nginx.com self.conf({'http': { 'header_read_timeout': 4 }}, 'settings') 34756Szelenkov@nginx.com 35756Szelenkov@nginx.com (resp, sock) = self.http(b"""GET / HTTP/1.1 36759Szelenkov@nginx.com""", start=True, raw=True, no_recv=True) 37756Szelenkov@nginx.com 38756Szelenkov@nginx.com time.sleep(2) 39756Szelenkov@nginx.com 40756Szelenkov@nginx.com (resp, sock) = self.http(b"""Host: localhost 41759Szelenkov@nginx.com""", start=True, sock=sock, raw=True, no_recv=True) 42759Szelenkov@nginx.com 43759Szelenkov@nginx.com time.sleep(2) 44759Szelenkov@nginx.com 45759Szelenkov@nginx.com (resp, sock) = self.http(b"""X-Blah: blah 46*767Szelenkov@nginx.com""", start=True, sock=sock, raw=True) 47*767Szelenkov@nginx.com 48*767Szelenkov@nginx.com if len(resp) != 0: 49*767Szelenkov@nginx.com sock.close() 50756Szelenkov@nginx.com 51*767Szelenkov@nginx.com else: 52*767Szelenkov@nginx.com time.sleep(2) 53756Szelenkov@nginx.com 54*767Szelenkov@nginx.com resp = self.http(b"""Connection: close 55756Szelenkov@nginx.com 56756Szelenkov@nginx.com""", sock=sock, raw=True) 57756Szelenkov@nginx.com 58756Szelenkov@nginx.com self.assertEqual(resp['status'], 408, 59756Szelenkov@nginx.com 'status header read timeout update') 60756Szelenkov@nginx.com 61730Szelenkov@nginx.com def test_settings_body_read_timeout(self): 62730Szelenkov@nginx.com self.load('empty') 63730Szelenkov@nginx.com 64760Szelenkov@nginx.com self.conf({'http': { 'body_read_timeout': 2 }}, 'settings') 65730Szelenkov@nginx.com 66730Szelenkov@nginx.com (resp, sock) = self.http(b"""POST / HTTP/1.1 67730Szelenkov@nginx.comHost: localhost 68730Szelenkov@nginx.comContent-Length: 10 69730Szelenkov@nginx.comConnection: close 70730Szelenkov@nginx.com 71730Szelenkov@nginx.com""", start=True, raw_resp=True, raw=True) 72730Szelenkov@nginx.com 73730Szelenkov@nginx.com time.sleep(3) 74730Szelenkov@nginx.com 75730Szelenkov@nginx.com resp = self.http(b"""0123456789""", sock=sock, raw=True) 76730Szelenkov@nginx.com 77730Szelenkov@nginx.com self.assertEqual(resp['status'], 408, 'status body read timeout') 78730Szelenkov@nginx.com 79756Szelenkov@nginx.com def test_settings_body_read_timeout_update(self): 80756Szelenkov@nginx.com self.load('empty') 81756Szelenkov@nginx.com 82760Szelenkov@nginx.com self.conf({'http': { 'body_read_timeout': 4 }}, 'settings') 83756Szelenkov@nginx.com 84756Szelenkov@nginx.com (resp, sock) = self.http(b"""POST / HTTP/1.1 85756Szelenkov@nginx.comHost: localhost 86756Szelenkov@nginx.comContent-Length: 10 87756Szelenkov@nginx.comConnection: close 88756Szelenkov@nginx.com 89756Szelenkov@nginx.com""", start=True, raw=True) 90756Szelenkov@nginx.com 91756Szelenkov@nginx.com time.sleep(2) 92756Szelenkov@nginx.com 93756Szelenkov@nginx.com (resp, sock) = self.http(b"""012""", start=True, sock=sock, raw=True) 94756Szelenkov@nginx.com 95756Szelenkov@nginx.com time.sleep(2) 96756Szelenkov@nginx.com 97756Szelenkov@nginx.com (resp, sock) = self.http(b"""345""", start=True, sock=sock, raw=True) 98756Szelenkov@nginx.com 99756Szelenkov@nginx.com time.sleep(2) 100756Szelenkov@nginx.com 101756Szelenkov@nginx.com resp = self.http(b"""6789""", sock=sock, raw=True) 102756Szelenkov@nginx.com 103756Szelenkov@nginx.com self.assertEqual(resp['status'], 200, 'status body read timeout update') 104756Szelenkov@nginx.com 105730Szelenkov@nginx.com def test_settings_send_timeout(self): 106730Szelenkov@nginx.com self.load('mirror') 107730Szelenkov@nginx.com 108730Szelenkov@nginx.com data_len = 1048576 109730Szelenkov@nginx.com 110760Szelenkov@nginx.com self.conf({'http': { 'send_timeout': 1 }}, 'settings') 111730Szelenkov@nginx.com 112730Szelenkov@nginx.com addr = self.testdir + '/sock' 113730Szelenkov@nginx.com 114760Szelenkov@nginx.com self.conf({"unix:" + addr: {'application': 'mirror'}}, 'listeners') 115730Szelenkov@nginx.com 116730Szelenkov@nginx.com sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) 117730Szelenkov@nginx.com sock.connect(addr) 118730Szelenkov@nginx.com 119730Szelenkov@nginx.com req = """POST / HTTP/1.1 120730Szelenkov@nginx.comHost: localhost 121730Szelenkov@nginx.comContent-Type: text/html 122730Szelenkov@nginx.comContent-Length: %d 123730Szelenkov@nginx.com 124730Szelenkov@nginx.com""" % data_len + ('X' * data_len) 125730Szelenkov@nginx.com 126730Szelenkov@nginx.com sock.sendall(req.encode()) 127730Szelenkov@nginx.com 128730Szelenkov@nginx.com data = sock.recv(16).decode() 129730Szelenkov@nginx.com 130730Szelenkov@nginx.com time.sleep(3) 131730Szelenkov@nginx.com 132738Szelenkov@nginx.com data += self.recvall(sock).decode() 133730Szelenkov@nginx.com 134730Szelenkov@nginx.com sock.close() 135730Szelenkov@nginx.com 136730Szelenkov@nginx.com self.assertRegex(data, r'200 OK', 'status send timeout') 137730Szelenkov@nginx.com self.assertLess(len(data), data_len, 'data send timeout') 138730Szelenkov@nginx.com 139730Szelenkov@nginx.com def test_settings_idle_timeout(self): 140730Szelenkov@nginx.com self.load('empty') 141730Szelenkov@nginx.com 142760Szelenkov@nginx.com self.conf({'http': { 'idle_timeout': 2 }}, 'settings') 143730Szelenkov@nginx.com 144730Szelenkov@nginx.com (resp, sock) = self.get(headers={ 145730Szelenkov@nginx.com 'Connection': 'keep-alive', 146730Szelenkov@nginx.com 'Host': 'localhost' 147730Szelenkov@nginx.com }, start=True) 148730Szelenkov@nginx.com 149730Szelenkov@nginx.com time.sleep(3) 150730Szelenkov@nginx.com 151730Szelenkov@nginx.com resp = self.get(headers={ 152730Szelenkov@nginx.com 'Connection': 'close', 153730Szelenkov@nginx.com 'Host': 'localhost' 154730Szelenkov@nginx.com }, sock=sock) 155730Szelenkov@nginx.com 156755Szelenkov@nginx.com self.assertEqual(resp['status'], 408, 'status idle timeout') 157730Szelenkov@nginx.com 158730Szelenkov@nginx.com def test_settings_max_body_size(self): 159730Szelenkov@nginx.com self.load('empty') 160730Szelenkov@nginx.com 161760Szelenkov@nginx.com self.conf({'http': { 'max_body_size': 5 }}, 'settings') 162730Szelenkov@nginx.com 163730Szelenkov@nginx.com self.assertEqual(self.post(body='01234')['status'], 200, 'status size') 164730Szelenkov@nginx.com self.assertEqual(self.post(body='012345')['status'], 413, 165730Szelenkov@nginx.com 'status size max') 166730Szelenkov@nginx.com 167730Szelenkov@nginx.com @unittest.expectedFailure 168730Szelenkov@nginx.com def test_settings_negative_value(self): 169730Szelenkov@nginx.com self.assertIn('error', self.conf({'http': { 'max_body_size': -1 }}, 170760Szelenkov@nginx.com 'settings'), 'settings negative value') 171730Szelenkov@nginx.com 172730Szelenkov@nginx.comif __name__ == '__main__': 173730Szelenkov@nginx.com unittest.main() 174