Agarde a liña en branco despois de CONNECT
Lea a resposta HTTP/1 CONNECT completa antes de entregar o socket a TLS, mesmo cando a liña de estado chega primeiro.
O cliente ve 200 Connection Established, inicia TLS e de inmediato informa de desatinos onde debería haber un rexistro TLS. Busque unha resposta HTTP inacabada antes de culpar os axustes de cifrado do destino.
Nun intercambio HTTP/1 CONNECT, a liña de estado é só o comezo da resposta. Despois poden vir campos de cabeceira. A liña en branco que pecha a sección de cabeceiras marca o paso ao túnel tras unha resposta CONNECT correcta.
HTTP/1.1 200 Connection Established\r\n
Proxy-Agent: example\r\n
\r\n
Eses bytes poden chegar nunha lectura, en varias ou nunha lectura que tamén conteña bytes posteriores. TCP non conserva os límites de escritura do servidor.
Faga da entrega un estado explícito do analizador
- Recolla e analice a liña de estado. Use o estado numérico en lugar dunha frase de motivo en inglés exacta.
- Continue ata que chegase o terminador completo da sección de cabeceiras. Unha liña de estado correcta non fai desaparecer os campos restantes.
- Ante unha resposta CONNECT correcta, identifique o byte inmediatamente posterior a ese terminador como o inicio dos datos do túnel. Ante outras respostas, siga o tratamento correspondente de resposta HTTP e autenticación.
- Transfira a conexión e os bytes non consumidos pola interface de E/S con búfer que admita o protocolo seguinte.
O último paso importa mesmo cunha boa busca de delimitadores. Un lector con búfer pode ter consumido máis do socket do que pediu o analizador. Iniciar TLS no socket espido mentres se abandona ese lector pode deixar bytes atrapados no búfer privado do lector.
Use un prazo de configuración e un límite de tamaño de cabeceira. Un EOF antes do terminador é unha resposta de proxy incompleta, non unha invitación a agardar para sempre nin a probar TLS de todos os xeitos.
Razoe varios límites
Imagine unha lectura que remata xusto despois de Proxy-Agent:. O analizador aínda necesita máis bytes de cabeceira HTTP. Imagine outra que remata a metade da secuencia CRLF final. Iso aínda non é unha sección de cabeceiras completa. Agora imagine unha sección de cabeceiras completa e correcta seguida de bytes de túnel no mesmo búfer: eses bytes extra deben sobrevivir á entrega.
Un 407 é un desenlace distinto. Precisa tratamento de autenticación; non autoriza ningún TLS ClientHello cara a un túnel que nunca se abriu.
Prefera un conector mantido agás que implementar o aperto de mans sexa a tarefa. Este límite é específico do intercambio HTTP/1 que se mostra aquí. Un proxy HTTP/2 leva CONNECT nun fluxo cunha trama diferente.