Klien melihat 200 Connection Established, memulai TLS, lalu langsung melaporkan hal tak masuk akal di tempat yang seharusnya berisi record TLS. Cari respons HTTP yang belum selesai sebelum menyalahkan setelan cipher tujuan.

Dalam pertukaran HTTP/1 CONNECT, baris status hanyalah awal respons. Kolom header bisa menyusul. Baris kosong yang mengakhiri bagian header menandai peralihan ke terowongan setelah respons CONNECT berhasil.

HTTP/1.1 200 Connection Established\r\n
Proxy-Agent: example\r\n
\r\n

Byte itu bisa tiba dalam satu pembacaan, beberapa pembacaan, atau pembacaan yang juga memuat byte berikutnya. TCP tidak mempertahankan batas tulis server.

Jadikan penyerahan sebagai status parser yang eksplisit

  1. Kumpulkan dan uraikan baris status. Gunakan status numerik, bukan frasa alasan bahasa Inggris yang persis.
  2. Lanjutkan sampai terminator bagian header yang lengkap tiba. Baris status yang berhasil tidak membuat kolom sisanya hilang.
  3. Untuk respons CONNECT yang berhasil, anggap byte tepat setelah terminator itu sebagai awal data terowongan. Untuk respons lain, ikuti penanganan respons HTTP dan autentikasi yang sesuai.
  4. Pindahkan koneksi dan byte yang belum terpakai melalui antarmuka I/O berpenyangga yang didukung protokol berikutnya.

Langkah terakhir tetap penting meski pencarian pembatas sudah baik. Pembaca berpenyangga bisa saja sudah mengonsumsi lebih banyak socket daripada yang diminta parser. Memulai TLS pada socket telanjang sambil meninggalkan pembaca itu dapat menyisakan byte di penyangga pribadi pembaca.

Pakai tenggat penyiapan dan batas ukuran header. EOF sebelum terminator adalah respons proxy yang tidak lengkap, bukan ajakan menunggu selamanya atau tetap mencoba TLS.

Pikirkan beberapa batas

Bayangkan pembacaan yang berakhir setelah Proxy-Agent:. Parser masih butuh byte header HTTP tambahan. Bayangkan pembacaan lain yang berakhir di tengah urutan CRLF terakhir. Itu belum bagian header yang lengkap. Sekarang bayangkan bagian header berhasil yang lengkap diikuti byte terowongan di penyangga yang sama: byte ekstra itu harus selamat melewati penyerahan.

407 adalah hasil lain. Itu butuh penanganan autentikasi; itu tidak mengizinkan TLS ClientHello masuk ke terowongan yang tidak pernah dibuka.

Pilih konektor yang dirawat kecuali tugasnya memang mengimplementasikan handshake. Batas ini khusus untuk pertukaran HTTP/1 yang ditunjukkan di sini. Proxy HTTP/2 membawa CONNECT pada stream dengan framing berbeda.

Artikel terkait