1*730Szelenkov@nginx.comimport time 2*730Szelenkov@nginx.comimport socket 3*730Szelenkov@nginx.comimport unittest 4*730Szelenkov@nginx.comimport unit 5*730Szelenkov@nginx.com 6*730Szelenkov@nginx.comclass TestUnitSettings(unit.TestUnitApplicationPython): 7*730Szelenkov@nginx.com 8*730Szelenkov@nginx.com def setUpClass(): 9*730Szelenkov@nginx.com unit.TestUnit().check_modules('python') 10*730Szelenkov@nginx.com 11*730Szelenkov@nginx.com def test_settings_header_read_timeout(self): 12*730Szelenkov@nginx.com self.load('empty') 13*730Szelenkov@nginx.com 14*730Szelenkov@nginx.com self.conf({'http': { 'header_read_timeout': 2 }}, '/settings') 15*730Szelenkov@nginx.com 16*730Szelenkov@nginx.com (resp, sock) = self.http(b"""GET / HTTP/1.1 17*730Szelenkov@nginx.com""", start=True, raw=True) 18*730Szelenkov@nginx.com 19*730Szelenkov@nginx.com time.sleep(3) 20*730Szelenkov@nginx.com 21*730Szelenkov@nginx.com resp = self.http(b"""Host: localhost 22*730Szelenkov@nginx.comConnection: close 23*730Szelenkov@nginx.com 24*730Szelenkov@nginx.com""", sock=sock, raw=True) 25*730Szelenkov@nginx.com 26*730Szelenkov@nginx.com self.assertEqual(resp['status'], 408, 'status header read timeout') 27*730Szelenkov@nginx.com 28*730Szelenkov@nginx.com def test_settings_body_read_timeout(self): 29*730Szelenkov@nginx.com self.load('empty') 30*730Szelenkov@nginx.com 31*730Szelenkov@nginx.com self.conf({'http': { 'body_read_timeout': 2 }}, '/settings') 32*730Szelenkov@nginx.com 33*730Szelenkov@nginx.com (resp, sock) = self.http(b"""POST / HTTP/1.1 34*730Szelenkov@nginx.comHost: localhost 35*730Szelenkov@nginx.comContent-Length: 10 36*730Szelenkov@nginx.comConnection: close 37*730Szelenkov@nginx.com 38*730Szelenkov@nginx.com""", start=True, raw_resp=True, raw=True) 39*730Szelenkov@nginx.com 40*730Szelenkov@nginx.com time.sleep(3) 41*730Szelenkov@nginx.com 42*730Szelenkov@nginx.com resp = self.http(b"""0123456789""", sock=sock, raw=True) 43*730Szelenkov@nginx.com 44*730Szelenkov@nginx.com self.assertEqual(resp['status'], 408, 'status body read timeout') 45*730Szelenkov@nginx.com 46*730Szelenkov@nginx.com def test_settings_send_timeout(self): 47*730Szelenkov@nginx.com self.load('mirror') 48*730Szelenkov@nginx.com 49*730Szelenkov@nginx.com data_len = 1048576 50*730Szelenkov@nginx.com 51*730Szelenkov@nginx.com self.conf({'http': { 'send_timeout': 1 }}, '/settings') 52*730Szelenkov@nginx.com 53*730Szelenkov@nginx.com addr = self.testdir + '/sock' 54*730Szelenkov@nginx.com 55*730Szelenkov@nginx.com self.conf({"unix:" + addr: {'application': 'mirror'}}, '/listeners') 56*730Szelenkov@nginx.com 57*730Szelenkov@nginx.com sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) 58*730Szelenkov@nginx.com sock.connect(addr) 59*730Szelenkov@nginx.com 60*730Szelenkov@nginx.com req = """POST / HTTP/1.1 61*730Szelenkov@nginx.comHost: localhost 62*730Szelenkov@nginx.comContent-Type: text/html 63*730Szelenkov@nginx.comContent-Length: %d 64*730Szelenkov@nginx.com 65*730Szelenkov@nginx.com""" % data_len + ('X' * data_len) 66*730Szelenkov@nginx.com 67*730Szelenkov@nginx.com sock.sendall(req.encode()) 68*730Szelenkov@nginx.com 69*730Szelenkov@nginx.com data = sock.recv(16).decode() 70*730Szelenkov@nginx.com 71*730Szelenkov@nginx.com time.sleep(3) 72*730Szelenkov@nginx.com 73*730Szelenkov@nginx.com data += self.recvall(sock) 74*730Szelenkov@nginx.com 75*730Szelenkov@nginx.com sock.close() 76*730Szelenkov@nginx.com 77*730Szelenkov@nginx.com self.assertRegex(data, r'200 OK', 'status send timeout') 78*730Szelenkov@nginx.com self.assertLess(len(data), data_len, 'data send timeout') 79*730Szelenkov@nginx.com 80*730Szelenkov@nginx.com 81*730Szelenkov@nginx.com def test_settings_idle_timeout(self): 82*730Szelenkov@nginx.com self.load('empty') 83*730Szelenkov@nginx.com 84*730Szelenkov@nginx.com self.conf({'http': { 'idle_timeout': 2 }}, '/settings') 85*730Szelenkov@nginx.com 86*730Szelenkov@nginx.com (resp, sock) = self.get(headers={ 87*730Szelenkov@nginx.com 'Connection': 'keep-alive', 88*730Szelenkov@nginx.com 'Host': 'localhost' 89*730Szelenkov@nginx.com }, start=True) 90*730Szelenkov@nginx.com 91*730Szelenkov@nginx.com time.sleep(3) 92*730Szelenkov@nginx.com 93*730Szelenkov@nginx.com resp = self.get(headers={ 94*730Szelenkov@nginx.com 'Connection': 'close', 95*730Szelenkov@nginx.com 'Host': 'localhost' 96*730Szelenkov@nginx.com }, sock=sock) 97*730Szelenkov@nginx.com 98*730Szelenkov@nginx.com self.assertEqual(resp, {}, 'idle timeout') 99*730Szelenkov@nginx.com 100*730Szelenkov@nginx.com def test_settings_max_body_size(self): 101*730Szelenkov@nginx.com self.load('empty') 102*730Szelenkov@nginx.com 103*730Szelenkov@nginx.com self.conf({'http': { 'max_body_size': 5 }}, '/settings') 104*730Szelenkov@nginx.com 105*730Szelenkov@nginx.com self.assertEqual(self.post(body='01234')['status'], 200, 'status size') 106*730Szelenkov@nginx.com self.assertEqual(self.post(body='012345')['status'], 413, 107*730Szelenkov@nginx.com 'status size max') 108*730Szelenkov@nginx.com 109*730Szelenkov@nginx.com @unittest.expectedFailure 110*730Szelenkov@nginx.com def test_settings_negative_value(self): 111*730Szelenkov@nginx.com self.assertIn('error', self.conf({'http': { 'max_body_size': -1 }}, 112*730Szelenkov@nginx.com '/settings'), 'settings negative value') 113*730Szelenkov@nginx.com 114*730Szelenkov@nginx.com 115*730Szelenkov@nginx.comif __name__ == '__main__': 116*730Szelenkov@nginx.com unittest.main() 117