NetworkStream.DataAvailable == false înseamnă că nu există octeți gata de citit imediat. Nu înseamnă că un răspuns HTTP este complet. O buclă care se oprește acolo poate trunchia o descărcare SOCKS perfect normală în timpul unei pauze între pachete.

După ce SOCKS stabilește conexiunea TCP, încadrarea HTTP oferă în continuare regula de finalizare:

  • Un corp cu Content-Length se termină după octeții de conținut declarați.
  • Un răspuns chunked are nevoie de chunk-ul final și de trailerele aplicabile.
  • Un răspuns delimitat de conexiune se termină odată cu conexiunea.
  • Unele statusuri și răspunsuri la HEAD nu au corp.

Citiți statusul și antetele pentru a determina regula aplicabilă. A aștepta doar închiderea nu este o soluție generală, deoarece un răspuns HTTP complet poate lăsa conexiunea deschisă. Capacitatea unui singur buffer este la fel de irelevantă pentru lungimea răspunsului.

Folosiți implementarea de încadrare a clientului HTTP atunci când acceptă transportul prin proxy ales. Pe un runtime .NET modern compatibil, luați în considerare suportul SOCKS nativ al HttpClient. O implementare brută trebuie să păstreze starea de analiză între antete parțiale și citirile corpului și să distingă finalizarea reușită de anulare, expirarea timpului și un EOF neașteptat. Într-o cerere de citire nevidă, zero octeți citiți înseamnă că fluxul s-a încheiat; aceasta diferă de absența octeților în coadă în acest moment.

Proxy-ul poate face vizibile pauzele de temporizare, dar nu transformă o coadă de recepție goală într-un marcaj de sfârșit de mesaj.

Articole similare