NetworkStream.DataAvailable ne označava kraj HTTP odgovora
Sprečite skraćena HTTP preuzimanja korišćenjem uokvirivanja poruka umesto NetworkStream.DataAvailable kao uslova završetka.
NetworkStream.DataAvailable == false znači da nema bajtova spremnih za trenutno čitanje. To ne znači da je HTTP odgovor završen. Petlja koja se tu zaustavi može odseći sasvim normalno SOCKS preuzimanje tokom pauze između paketa.
Nakon što SOCKS uspostavi TCP vezu, HTTP uokvirivanje i dalje daje pravilo završetka:
- Telo sa Content-Length završava se nakon objavljenih bajtova sadržaja.
- Chunked odgovor zahteva završni chunk i primenjive trailere.
- Odgovor ograničen vezom završava se zajedno sa vezom.
- Neki statusi i odgovori na HEAD nemaju telo.
Pročitajte status i zaglavlja da odredite primenjivo pravilo. Čekanje samo na zatvaranje nije opšte rešenje jer potpun HTTP odgovor može ostaviti vezu otvorenom. Kapacitet jednog bafera jednako je nepovezan sa dužinom odgovora.
Koristite implementaciju uokvirivanja HTTP klijenta kada podržava izabrani proxy transport. Na kompatibilnom modernom .NET runtime-u razmotrite urođenu SOCKS podršku HttpClient-a. Sirova implementacija mora da čuva stanje parsiranja kroz delimična zaglavlja i čitanja tela i da razlikuje uspešan završetak od otkazivanja, isteka vremena i neočekivanog EOF-a. Za zahtev čitanja koji nije prazan, nula pročitanih bajtova znači da je tok završio; to se razlikuje od toga da trenutno nema bajtova u redu.
Proxy može učiniti vremenske pauze uočljivim, ali ne pretvara prazan red za prijem u marker kraja poruke.