NetworkStream.DataAvailable markerar inte slutet på ett HTTP-svar
Undvik avkortade HTTP-nedladdningar genom att använda meddelanderamning i stället för NetworkStream.DataAvailable som slutvillkor.
NetworkStream.DataAvailable == false betyder att det inte finns några byte redo att läsas omedelbart. Det betyder inte att ett HTTP-svar är komplett. En loop som stannar där kan korta av en helt normal SOCKS-nedladdning under ett gap mellan paket.
När SOCKS har upprättat TCP-anslutningen ger HTTP-ramningen fortfarande slutföranderegeln:
- En body med Content-Length slutar efter de angivna innehållsbyten.
- Ett chunked-svar behöver sin avslutande chunk och tillämpliga trailers.
- Ett anslutningsavgränsat svar slutar med anslutningen.
- Vissa statuskoder och svar på HEAD har ingen body.
Läs status och huvuden för att avgöra vilken regel som gäller. Att bara vänta på stängning är ingen generell lösning, eftersom ett komplett HTTP-svar kan lämna anslutningen öppen. Kapaciteten hos en buffert är lika irrelevant för svarets längd.
Använd HTTP-klientens ramningsimplementering när den stöder den valda proxytransporten. På en kompatibel modern .NET-runtime kan du överväga HttpClients inbyggda SOCKS-stöd. En rå implementering måste behålla parsningstillstånd över partiella huvuden och body-läsningar, och skilja lyckat slutförande från avbrott, timeout och oväntad EOF. För en icke-tom läsförfrågan betyder noll lästa byte att strömmen är slut; det skiljer sig från att det just nu inte ligger några byte i kön.
Proxyn kan göra tidsgap tydliga, men den förvandlar inte en tom mottagningskö till en markering för meddelandets slut.