NetworkStream.DataAvailable == false significa que não há bytes prontos para leitura imediata. Não significa que uma resposta HTTP esteja completa. Um laço que para ali pode truncar um download SOCKS perfeitamente normal durante uma pausa entre pacotes.

Depois que o SOCKS estabelece a conexão TCP, o enquadramento HTTP ainda fornece a regra de conclusão:

  • Um corpo com Content-Length termina após os bytes de conteúdo declarados.
  • Uma resposta chunked precisa do chunk final e dos trailers aplicáveis.
  • Uma resposta delimitada pela conexão termina com a conexão.
  • Alguns status e respostas a HEAD não têm corpo.

Leia o status e os cabeçalhos para determinar a regra aplicável. Esperar apenas pelo fechamento não é uma solução geral, porque uma resposta HTTP completa pode deixar a conexão aberta. A capacidade de um buffer é igualmente alheia ao comprimento da resposta.

Use a implementação de enquadramento do cliente HTTP quando ela suportar o transporte de proxy escolhido. Em um runtime .NET moderno compatível, considere o suporte nativo a SOCKS do HttpClient. Uma implementação crua deve manter o estado de análise entre cabeçalhos parciais e leituras do corpo, e distinguir a conclusão bem-sucedida do cancelamento, do tempo limite e de um EOF inesperado. Em uma solicitação de leitura não vazia, zero bytes lidos significa que o fluxo terminou; isso é diferente de não haver bytes na fila neste momento.

O proxy pode tornar as pausas de temporização visíveis, mas não transforma uma fila de recepção vazia em marcador de fim de mensagem.

Artigos relacionados