NetworkStream.DataAvailable markerer ikkje slutten på eit HTTP-svar
Unngå avkorta HTTP-nedlastingar ved å bruke meldingsrammer i staden for NetworkStream.DataAvailable som sluttvilkår.
NetworkStream.DataAvailable == false tyder at det ikkje er bytes klare til å lesast med ein gong. Det tyder ikkje at eit HTTP-svar er fullstendig. Ei løkke som stoppar der, kan korta av ei heilt normal SOCKS-nedlasting under eit gap mellom pakkar.
Etter at SOCKS har oppretta TCP-tilkoplinga, gjev HTTP-rammeverket framleis fullføringsregelen:
- Ein body med Content-Length sluttar etter dei oppgjevne innhaldsbyta.
- Eit chunked-svar treng den avsluttande chunk-en og relevante trailers.
- Eit tilkopling-avgrensa svar sluttar med tilkoplinga.
- Nokre statusar og svar på HEAD har ingen body.
Les status og headers for å fastslå den gjeldande regelen. Å vente berre på lukking er ikkje ei generell løysing, fordi eit fullstendig HTTP-svar kan la tilkoplinga stå open. Kapasiteten til ein buffer er like lite relevant for lengda på svaret.
Bruk rammeimplementasjonen til HTTP-klienten når han støttar den valde proxytransporten. På ein kompatibel moderne .NET-runtime kan du vurdere den innebygde SOCKS-støtta til HttpClient. Ein rå implementasjon må halde på parsestatusen over delvise headers og body-lesingar, og skilje vellukka fullføring frå avbrot, tidsavbrot og uventa EOF. For ein ikkje-tom leseførespurnad tyder null lesne bytes at straumen er slutt; dette er annleis enn at det akkurat no ikkje ligg bytes i køen.
Proxyen kan gjere tidsgap tydelege, men han gjer ikkje ein tom mottakskø om til ein markør for slutten på meldinga.