NetworkStream.DataAvailable == false significa che non ci sono byte pronti per la lettura immediata. Non significa che una risposta HTTP sia completa. Un ciclo che si ferma lì può troncare un download SOCKS del tutto normale durante una pausa tra pacchetti.

Dopo che SOCKS ha stabilito la connessione TCP, l'incorniciatura HTTP fornisce ancora la regola di completamento:

  • Un corpo con Content-Length termina dopo i byte di contenuto dichiarati.
  • Una risposta chunked richiede il chunk finale e i trailer applicabili.
  • Una risposta delimitata dalla connessione termina con la connessione.
  • Alcuni stati e risposte a HEAD non hanno corpo.

Leggi lo stato e le intestazioni per determinare la regola applicabile. Attendere solo la chiusura non è una soluzione generale, perché una risposta HTTP completa può lasciare aperta la connessione. La capacità di un buffer è altrettanto estranea alla lunghezza della risposta.

Usa l'implementazione di incorniciatura del client HTTP quando supporta il trasporto proxy scelto. Su un runtime .NET moderno compatibile, valuta il supporto SOCKS nativo di HttpClient. Un'implementazione grezza deve mantenere lo stato di analisi tra intestazioni parziali e letture del corpo e distinguere il completamento riuscito da annullamento, timeout ed EOF inatteso. In una richiesta di lettura non vuota, zero byte letti significa che il flusso è terminato; questo è diverso dal fatto che in questo momento non ci siano byte in coda.

Il proxy può rendere evidenti le pause di temporizzazione, ma non trasforma una coda di ricezione vuota in un marcatore di fine messaggio.

Articoli correlati