Понадобился не совсем обычный прокси-сервер, в качестве тренировки (а также ввиду отсутствия готовых решений с необходимым функционалом) решил написать его сам, питон отлично мне подходит для этой задачи. Нашел несколько исходников, были и совсем простые, буквально в 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 и закрывать соединения. Но это ведь бред - так можно и полтора часа ждать загрузки сайта, пока прокси отработает соединения со всеми хостами… Может быть, как-то можно по-другому отследить окончание обмена данными? С сокетами просто не работал никогда, не очень хорошо прошарил, что к чему