NetworkStream.DataAvailable == false znamená, že nie sú k dispozícii žiadne bajty na okamžité čítanie. Neznamená to, že odpoveď HTTP je dokončená. Slučka, ktorá sa tam zastaví, môže počas medzery medzi paketmi skrátiť úplne normálne sťahovanie cez SOCKS.

Po tom, čo SOCKS nadviaže spojenie TCP, pravidlo dokončenia stále určuje rámcovanie HTTP:

  • Telo s Content-Length končí po deklarovaných bajtoch obsahu.
  • Odpoveď s chunked kódovaním potrebuje záverečný chunk a príslušné trailery.
  • Odpoveď ohraničená spojením končí spolu so spojením.
  • Niektoré stavy a odpovede na HEAD nemajú telo.

Prečítajte stav a hlavičky, aby ste určili platné pravidlo. Čakanie iba na uzavretie nie je všeobecné riešenie, pretože kompletná odpoveď HTTP môže nechať spojenie otvorené. Kapacita jedného buffera tiež nesúvisí s dĺžkou odpovede.

Použite implementáciu rámcovania HTTP klienta, ak podporuje zvolený proxy transport. Na kompatibilnom modernom runtime .NET zvážte natívnu podporu SOCKS v HttpClient. Surová implementácia musí uchovávať stav parsovania naprieč čiastočnými hlavičkami a čítaniami tela a rozlišovať úspešné dokončenie od zrušenia, vypršania časového limitu a neočakávaného EOF. Pri neprázdnej požiadavke na čítanie znamená nula prečítaných bajtov, že tok sa skončil; to sa líši od toho, že v rade práve teraz nie sú žiadne bajty.

Proxy môže časové medzery zviditeľniť, ale prázdny prijímací rad nezmení na značku konca správy.

Súvisiace články