/
zOMGdev
/
cppcms
Обзор
Документация
Войти
/
zOMGdev
/
cppcms
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
tests/http_timeouts_test.py
90 строк
2 KB
Artyom Beilis
Support of python 2.7 and python 3
26 авг 2020, 00:16
26 авг 2020, 00:16
0c67544
Код
Авторство
О чём код?
#!/usr/bin/env python # coding=utf-8 # vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 import socket import time import traceback import random import sys timeout_time = 5 def test(x): if not x: print("Error") traceback.print_stack() sys.exit(1) def make_sock(): s=socket.socket(socket.AF_INET,socket.SOCK_STREAM); s.connect(('localhost',8080)); s.setsockopt(socket.IPPROTO_TCP,socket.TCP_NODELAY,1) return s; def test_unfinished_out(msg,chunks=[]): print("Tesing %s with %d chunks" % (msg,len(chunks))) s=make_sock(); if len(msg) > 0 : s.send(msg.encode()) if len(chunks) > 0: for chunk in chunks: time.sleep(1) s.send(chunk.encode()) start = time.time() text = s.recv(1) passed = time.time() - start test(len(text) == 0) global timeout_time test(passed > timeout_time - 2) test(passed < timeout_time + 2) def test_unfinished_read(msg,reads,ignore): print("Tesing %s with %d reads" % (msg,reads)) s=make_sock(); s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF,32768) read_size = s.getsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF) print("SO_RCVBUF=%d" % read_size) if read_size < 32768: read_size = 32768 s.send(msg.encode() + b'\r\n\r\n') for n in range(0,reads): time.sleep(1) text = s.recv(read_size) l = len(text) test(l > 0) global timeout_time time.sleep(timeout_time * 2) n=0 while 1: text = s.recv(read_size); if len(text) > 0: n = n + len(text) else: break test(n < read_size * 16 or n < 1000000) write = sys.argv[1] == 'write' if len(sys.argv) >= 3: timeout_time = int(sys.argv[2]) if write: print('Write to the client timeout') test_unfinished_read('GET /async/long HTTP/1.0',0,0) test_unfinished_read('GET /async/long HTTP/1.0',timeout_time + 20,1000) test_unfinished_read('GET /sync/long HTTP/1.0',0,0) test_unfinished_read('GET /sync/long HTTP/1.0',timeout_time + 20,1000) else: print('Read from client timeouts') test_unfinished_out('') test_unfinished_out('GET /sync/long') test_unfinished_out('POST /sync/long HTTP/1.0\r\nContent-Length:10000\r\n\r\nbla bla') test_unfinished_out('POST /sync/long HTTP/1.0\r\nContent-Length:10000\r\n\r\n', ['ss','ss','ss','ss']) print('Disconnect the client timeout') test_unfinished_out('GET /async/goteof HTTP/1.0\r\n\r\n') time.sleep(1)