NetworkStream.DataAvailable markerer ikke slutten på et HTTP-svar
Unngå avkortede HTTP-nedlastinger ved å bruke meldingsrammer i stedet for NetworkStream.DataAvailable som sluttbetingelse.
NetworkStream.DataAvailable == false betyr at det ikke er bytes klare til å leses umiddelbart. Det betyr ikke at et HTTP-svar er fullstendig. En løkke som stopper der, kan avkorte en helt normal SOCKS-nedlasting under et gap mellom pakker.
Etter at SOCKS har opprettet TCP-tilkoblingen, gir HTTP-rammeverket fortsatt fullføringsregelen:
- En body med Content-Length slutter etter de oppgitte innholdsbyttene.
- Et chunked-svar trenger sin avsluttende chunk og relevante trailers.
- Et tilkoblingsavgrenset svar slutter med tilkoblingen.
- Noen statuser og svar på HEAD har ingen body.
Les status og headere for å fastslå den gjeldende regelen. Å vente bare på lukking er ikke en generell løsning, fordi et fullstendig HTTP-svar kan la tilkoblingen stå åpen. Kapasiteten til én buffer er like lite relevant for svarets lengde.
Bruk HTTP-klientens rammeimplementasjon når den støtter den valgte proxytransporten. På en kompatibel moderne .NET-runtime kan du vurdere HttpClients innebygde SOCKS-støtte. En rå implementasjon må bevare parsingstilstand på tvers av delvise headere og body-lesinger, og skille vellykket fullføring fra avbrudd, tidsavbrudd og uventet EOF. For en ikke-tom leseforespørsel betyr null leste bytes at strømmen er slutt; dette er forskjellig fra at det akkurat nå ikke ligger bytes i køen.
Proxyen kan gjøre tidsgap tydelige, men den gjør ikke en tom mottakskø om til en markør for meldingens slutt.