Body POST proxy HTTP Python dapat dibufer di rfile
Baca permintaan proxy HTTP Python melalui input terbufer milik handler alih-alih menunggu byte yang sudah meninggalkan buffer soket.
Proxy penerus membaca baris permintaan dan header, meneruskannya, lalu menunggu di select sebuah body POST. Klien sudah mengirimnya. Kedua sisi tampak saling menunggu.
Dengan BaseHTTPRequestHandler Python, pembacaan header melewati rfile, aliran input terbufer. Aliran itu dapat membaca lebih awal dan menahan byte milik body. Menunggu pada soket di bawahnya hanya menanyakan apakah deskriptor berkasnya siap; ia tidak menanyakan apakah aliran Python sudah berisi data yang dapat dipakai.
Ikuti buffer yang membaca header
Baca body juga melalui self.rfile. Jangan beralih ke self.connection.recv setelah mengurai header dengan aliran terbufer. Jika tidak, kode dapat melewati byte yang sudah ditahan aliran itu dan menunggu data yang tidak akan pernah dikirim lagi.
Memberikan rfile sendiri ke select tidak membuat select memeriksa buffer Python-nya. API kesiapan bekerja melalui deskriptor berkas objek.
Untuk permintaan dengan satu Content-Length yang valid dan tanpa Transfer-Encoding, konsumsi tepat jumlah byte yang dideklarasikan, sambil menangani akhir input yang terlalu dini serta batas ukuran dan waktu Anda. Jangan membaca sampai EOF: klien yang memakai koneksi persisten dapat membiarkan koneksi tetap terbuka setelah menyelesaikan permintaan.
Jadikan pembingkaian bagian eksplisit dari proxy
Body permintaan chunked memerlukan dukungan pembingkaian chunked. Itu tidak dapat dibaca dengan mencari Content-Length yang tidak ada. Metadata panjang yang ambigu memerlukan jalur penolakan yang jelas, bukan memilih header yang tampak nyaman.
Handler pemblokir dapat terus memakai antarmuka alirannya dengan pembacaan terbatas. Proxy berbasis peristiwa memerlukan model buffer yang memadukan pembacaan awal parser dengan penanganan kesiapan. Mengubah timeout tidak akan mendamaikan dua konsumen independen dari soket yang sama.
Diagnosis ini khusus tentang di mana byte masuk ditahan. Setelah proxy mengonsumsi body yang benar, ia masih harus meneruskan body itu dengan pembingkaian HTTP yang konsisten. Handler http.server standar adalah tempat berguna untuk memahami mekanismenya, tetapi itu bukan implementasi proxy penerus untuk produksi.