Понадобился не совсем обычный прокси-сервер, в качестве тренировки (а также ввиду отсутствия готовых решений с необходимым функционалом) решил написать его сам, питон отлично мне подходит для этой задачи. Нашел несколько исходников, были и совсем простые, буквально в 200 строк. С хэндшейком разобрался, проблем не возникает. Но вот никак не могу понять, как правильно действовать после.. Сейчас имеется вот такой код:
def forward(src, dest):
try:
data = src.recv(10)
while data:
dest.sendall(data)
data = src.recv(10)
except:
src.close()
dest.close()
while True:
insock, addr_info = sock.accept()
print 'start proxy session with client', addr_info[0]
# ... handshake
# ... получение ip и port
# ... коннект к ip:port -> outsock
Thread(target=forward, args=(insock, outsock)).start()
Thread(target=forward, args=(outsock, insock)).start()
То есть запускается два потока, которые обмениваются данными. Вопрос в том, как грамотно отследить, что данные закончились? В голову пришло только ставить таймаут
socket.settimeout(), к примеру, 5 секунд, ловить
socket.error и закрывать соединения. Но это ведь бред - так можно и полтора часа ждать загрузки сайта, пока прокси отработает соединения со всеми хостами… Может быть, как-то можно по-другому отследить окончание обмена данными? С сокетами просто не работал никогда, не очень хорошо прошарил, что к чему