NetworkStream.DataAvailable == false significa que no hay bytes listos para leerse de inmediato. No significa que una respuesta HTTP esté completa. Un bucle que se detiene ahí puede truncar una descarga SOCKS perfectamente normal durante una pausa entre paquetes.

Después de que SOCKS establece la conexión TCP, el enmarcado HTTP sigue aportando la regla de finalización:

  • Un cuerpo con Content-Length termina tras los bytes de contenido declarados.
  • Una respuesta chunked necesita su chunk final y los trailers aplicables.
  • Una respuesta delimitada por la conexión termina con la conexión.
  • Algunos estados y respuestas a HEAD no tienen cuerpo.

Lee el estado y las cabeceras para determinar la regla aplicable. Esperar solo el cierre no es una solución general, porque una respuesta HTTP completa puede dejar la conexión abierta. La capacidad de un búfer es igualmente ajena a la longitud de la respuesta.

Usa la implementación de enmarcado del cliente HTTP cuando admita el transporte de proxy elegido. En un runtime .NET moderno compatible, considera la compatibilidad nativa con SOCKS de HttpClient. Una implementación cruda debe mantener el estado de análisis entre cabeceras parciales y lecturas del cuerpo, y distinguir la finalización correcta de la cancelación, el tiempo de espera y un EOF inesperado. En una solicitud de lectura no vacía, leer cero bytes significa que el flujo terminó; esto es distinto de que ahora mismo no haya bytes en cola.

El proxy puede hacer visibles las pausas de temporización, pero no convierte una cola de recepción vacía en un marcador de fin de mensaje.

Artículos relacionados