Когда CONNECT возвращает 200, а TLS сразу не декодируется, проверьте граничные байты в коннекторе, прежде чем менять сертификаты или шифры.

Сгенерированное значение авторизации может уже заканчиваться переводом строки. Добавление ещё одного конца строки может завершить HTTP-заголовки раньше времени, оставив нужное поле Host или другой открытый текст за запросом.

Минимальный запрос HTTP/1.1 CONNECT использует CRLF между строками и пустую строку в конце:

b"CONNECT example.com:443 HTTP/1.1\r\nHost: example.com:443\r\n\r\n"

Поместите любое поле авторизации перед этой последней пустой строкой, без встроенного перевода строки. В Python "\n" обозначает перевод строки, а сырая строка с обратной косой чертой и буквой n — нет. Проверьте, какие байты создаёт помощник кодирования, прежде чем пытаться их удалить—старые помощники могли добавлять переводы строк.

После успешного CONNECT эти оставшиеся байты принадлежат протоколу туннеля. Заблудившийся открытый текст может попасть к партнёру, ожидающему TLS. Успешный статус не может исправить байты, уже поставленные в очередь после некорректного запроса.

Проверьте и границу приёма. Прочитайте полный ответ прокси, прежде чем передать сокет TLS, обрабатывайте частичные чтения и сохраняйте всё, что прочитано за заголовками. Одно чтение сокета не обязано содержать одно целое сообщение.

Если этот парсер ваш, сравните отредактированное представление байтов с грамматикой провода; держите длины и границы строк видимыми, скрывая пароль. Для приложения, которому нужен только прокси-доступ, поддерживаемый коннектор избавляет от необходимости владеть этим кодом разметки.

Похожие статьи