NetworkStream.DataAvailable markerer ikke slutten på en HTTP-respons
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 en HTTP-respons er fullstendig. En løkke som stopper der, kan avkorte en helt normal SOCKS-nedlasting i et gap mellom pakker.
Etter at SOCKS har opprettet TCP-forbindelsen, gir HTTP-rammeverket fortsatt fullføringsregelen:
- En body med Content-Length slutter etter de oppgitte innholdsbyttene.
- En chunked-respons trenger sin avsluttende chunk og relevante trailers.
- En forbindelsesavgrenset respons slutter med forbindelsen.
- Noen statuser og responser 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 en fullstendig HTTP-respons kan la forbindelsen stå åpen. Kapasiteten til én buffer er like lite relevant for lengden på responsen.
Bruk rammeimplementasjonen til HTTP-klienten når den støtter den valgte proxytransporten. På en kompatibel moderne .NET-runtime kan du vurdere den innebygde SOCKS-støtten i HttpClient. En rå implementasjon må bevare parsertilstanden på tvers av delvise headere og body-lesinger, og skille vellykket fullføring fra avbrytelse, 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 slutten på meldingen.