Penangan CONNECT Node.js harus mempertahankan buffer head
Tangani soket CONNECT dan buffer head Node di batas HTTP ke terowongan, pertahankan byte yang sudah terbaca melewati header.
Server HTTP Node menangani permintaan proxy biasa melalui callback permintaannya. CONNECT menempuh jalur lain: server memancarkan connect bersama permintaan, soket klien, dan buffer head.
Peristiwa itu adalah penyerahan antara penguraian HTTP dan terowongan. Tidak ada objek ServerResponse biasa untuk terus dipakai bagi lalu lintas terowongan.
| Argumen | Apa yang dibawanya |
|---|---|
req | Permintaan CONNECT, termasuk otoritas tujuan dan header-nya |
clientSocket | Koneksi kembali ke klien |
head | Data terowongan yang sudah dibaca Node melewati header HTTP, mungkin kosong |
Selesaikan keputusan HTTP sebelum meneruskan byte
Validasi host dan port yang diminta, terapkan kebijakan akses dan autentikasi proxy, dan buat koneksi hulu. CONNECT mengidentifikasi otoritas seperti service.example:443; uraikan bentuk itu dengan mempertimbangkan otoritas IPv6 alih-alih membelah secara buta pada setiap titik dua.
Saat terowongan diterima, kirim respons HTTP yang berhasil diikuti baris kosong penutupnya. Lalu teruskan byte head apa pun ke hulu sebelum melanjutkan dengan byte berikutnya dari soket klien. Melampirkan pendengar data baru tidak dapat memulihkan buffer yang sudah dikirim secara terpisah ke penangan.
Contoh terowongan resmi Node melakukan penyerahan itu dengan serverSocket.write(head) sebelum menghubungkan kedua arah aliran. Contoh kecilnya menggambarkan transisi; proxy yang diterapkan juga memerlukan upaya koneksi terbatas, kontrol akses, dan penanganan siklus hidup.
Setelah berhasil, byte menjadi milik protokol layanan
Respons CONNECT yang berhasil mengubah koneksi menjadi aliran byte. Jika targetnya situs HTTPS, pertukaran TLS-nya berjalan di dalam aliran itu. Sekadar menerowongkannya tidak mengharuskan proxy menerbitkan sertifikat situs web pengganti.
Sebelum menerima CONNECT, kesalahan HTTP dapat menjelaskan alasan penolakan. Setelah diterima, menulis HTTP 500 ke dalam aliran akan menyuntikkan byte ke protokol terowongan. Sebagai gantinya, akhiri atau hancurkan koneksi yang sesuai pada kegagalan berikutnya.
Hubungkan kedua arah dengan penanganan aliran yang sadar backpressure, dan putuskan bagaimana peristiwa end, error, dan close mengakhiri rekan. Pertahankan buffer head awal sebagai bagian dari model kepemilikan yang sama; itu data aplikasi, bukan header HTTP sisa untuk dibuang.