NetworkStream.DataAvailable no marca el final d'una resposta HTTP
Evita baixades HTTP truncades fent servir l'emmarcament de missatges en lloc de NetworkStream.DataAvailable com a condició de final.
NetworkStream.DataAvailable == false significa que no hi ha bytes a punt per llegir immediatament. No significa que una resposta HTTP estigui completa. Un bucle que s'atura aquí pot truncar una baixada SOCKS perfectament normal durant una pausa entre paquets.
Després que SOCKS estableixi la connexió TCP, l'emmarcament HTTP encara proporciona la regla de compleció:
- Un cos amb Content-Length acaba després dels bytes de contingut declarats.
- Una resposta chunked necessita el chunk final i els trailers aplicables.
- Una resposta delimitada per la connexió acaba amb la connexió.
- Alguns estats i respostes a HEAD no tenen cos.
Llegeix l'estat i les capçaleres per determinar la regla aplicable. Esperar només el tancament no és una solució general, perquè una resposta HTTP completa pot deixar la connexió oberta. La capacitat d'un buffer tampoc no té relació amb la longitud de la resposta.
Utilitza la implementació d'emmarcament del client HTTP quan admet el transport de proxy triat. En un runtime .NET modern compatible, considera el suport SOCKS natiu d'HttpClient. Una implementació crua ha de mantenir l'estat d'anàlisi entre capçaleres parcials i lectures del cos i distingir la compleció correcta de la cancel·lació, el temps d'espera i un EOF inesperat. Per a una sol·licitud de lectura no buida, llegir zero bytes significa que el flux ha acabat; això és diferent de que ara mateix no hi hagi bytes a la cua.
El proxy pot fer visibles les pauses de temporització, però no converteix una cua de recepció buida en un marcador de final de missatge.