NetworkStream.DataAvailable non marca o final dunha resposta HTTP
Evita as descargas HTTP truncadas usando o enmarcado de mensaxes en lugar de NetworkStream.DataAvailable como condición de fin.
NetworkStream.DataAvailable == false significa que non hai bytes listos para ler de inmediato. Non significa que unha resposta HTTP estea completa. Un bucle que se detén aí pode truncar unha descarga SOCKS perfectamente normal durante unha pausa entre paquetes.
Despois de que SOCKS estableza a conexión TCP, o enmarcado HTTP segue a fornecer a regra de finalización:
- Un corpo con Content-Length remata tras os bytes de contido declarados.
- Unha resposta chunked necesita o seu chunk final e os trailers aplicables.
- Unha resposta delimitada pola conexión remata coa conexión.
- Algúns estados e respostas a HEAD non teñen corpo.
Le o estado e as cabeceiras para determinar a regra aplicable. Agardar só polo peche non é unha solución xeral, porque unha resposta HTTP completa pode deixar a conexión aberta. A capacidade dun búfer é igual de allea á lonxitude da resposta.
Usa a implementación de enmarcado do cliente HTTP cando admita o transporte de proxy escollido. Nun runtime .NET moderno compatible, considera o soporte nativo de SOCKS de HttpClient. Unha implementación en bruto debe manter o estado de análise entre cabeceiras parciais e lecturas do corpo, e distinguir a finalización correcta da cancelación, do tempo de espera e dun EOF inesperado. Nunha solicitude de lectura non baleira, ler cero bytes significa que o fluxo rematou; isto é distinto de que agora mesmo non haxa bytes na cola.
O proxy pode facer visibles as pausas de temporización, pero non converte unha cola de recepción baleira nun marcador de fin de mensaxe.