Espere la línea en blanco después de CONNECT
Lea la respuesta HTTP/1 CONNECT completa antes de entregar el socket a TLS, incluso cuando la línea de estado llegue primero.
El cliente ve 200 Connection Established, inicia TLS y en seguida informa de desatinos donde debería haber un registro TLS. Busque una respuesta HTTP sin terminar antes de culpar a la configuración de cifrado del destino.
En un intercambio HTTP/1 CONNECT, la línea de estado es solo el comienzo de la respuesta. Después pueden venir campos de cabecera. La línea en blanco que cierra la sección de cabeceras marca el cambio al túnel tras una respuesta CONNECT correcta.
HTTP/1.1 200 Connection Established\r\n
Proxy-Agent: example\r\n
\r\n
Esos bytes pueden llegar en una lectura, en varias o en una lectura que también contenga bytes posteriores. TCP no conserva los límites de escritura del servidor.
Convierta la entrega en un estado explícito del analizador
- Recoja y analice la línea de estado. Use el estado numérico en lugar de una frase de motivo en inglés exacta.
- Continúe hasta que haya llegado el terminador completo de la sección de cabeceras. Una línea de estado correcta no hace desaparecer los campos restantes.
- Ante una respuesta CONNECT correcta, identifique el byte inmediatamente posterior a ese terminador como el inicio de los datos del túnel. Ante otras respuestas, siga el tratamiento correspondiente de respuesta HTTP y autenticación.
- Transfiera la conexión y los bytes no consumidos por la interfaz de E/S con búfer que admita el protocolo siguiente.
El último paso importa incluso con una buena búsqueda de delimitadores. Un lector con búfer puede haber consumido más del socket de lo que pidió el analizador. Iniciar TLS en el socket desnudo mientras se abandona ese lector puede dejar bytes atrapados en el búfer privado del lector.
Use un plazo de configuración y un límite de tamaño de cabecera. Un EOF antes del terminador es una respuesta de proxy incompleta, no una invitación a esperar para siempre ni a probar TLS de todos modos.
Razone varios límites
Imagine una lectura que termina justo después de Proxy-Agent:. El analizador aún necesita más bytes de cabecera HTTP. Imagine otra que termina a mitad de la secuencia CRLF final. Eso todavía no es una sección de cabeceras completa. Ahora imagine una sección de cabeceras completa y correcta seguida de bytes de túnel en el mismo búfer: esos bytes extra deben sobrevivir a la entrega.
Un 407 es un desenlace distinto. Necesita tratamiento de autenticación; no autoriza ningún TLS ClientHello hacia un túnel que nunca se abrió.
Prefiera un conector mantenido salvo que implementar el saludo sea la tarea. Este límite es específico del intercambio HTTP/1 que se muestra aquí. Un proxy HTTP/2 lleva CONNECT en un flujo con otro entramado.