NetworkStream.DataAvailable tidak menandakan penghujung respons HTTP
Elakkan muat turun HTTP terpotong dengan menggunakan pembingkaian mesej dan bukannya NetworkStream.DataAvailable sebagai syarat tamat.
NetworkStream.DataAvailable == false bermaksud tiada bait yang sedia untuk dibaca serta-merta. Ia tidak bermaksud respons HTTP sudah lengkap. Gelung yang berhenti di situ boleh memotong muat turun SOCKS yang sempurna normal semasa jurang antara paket.
Selepas SOCKS mewujudkan sambungan TCP, pembingkaian HTTP masih memberikan peraturan penyempurnaan:
- Badan dengan Content-Length tamat selepas bait kandungan yang diisytiharkan.
- Respons chunked memerlukan chunk penamat dan trailer yang berkenaan.
- Respons yang dibatasi oleh sambungan tamat bersama sambungan.
- Sesetengah status dan respons kepada HEAD tiada badan.
Baca status dan pengepala untuk menentukan peraturan yang terpakai. Menunggu penutupan sahaja bukan penyelesaian umum, kerana respons HTTP yang lengkap boleh membiarkan sambungan terbuka. Kapasiti satu penimbal juga sama tidak berkaitan dengan panjang respons.
Gunakan pelaksanaan pembingkaian klien HTTP apabila ia menyokong pengangkutan proksi yang dipilih. Pada runtime .NET moden yang serasi, pertimbangkan sokongan SOCKS asli HttpClient. Pelaksanaan mentah mesti mengekalkan keadaan penghuraian merentas pengepala separa dan bacaan badan, serta membezakan penyempurnaan berjaya daripada pembatalan, tamat masa dan EOF tidak dijangka. Dalam permintaan bacaan yang tidak kosong, sifar bait dibaca bermaksud aliran telah tamat; ini berbeza daripada tiada bait dalam baris gilir pada saat ini.
Proksi boleh menjadikan jurang masa kelihatan, tetapi ia tidak mengubah baris gilir penerimaan kosong menjadi penanda penghujung mesej.