NetworkStream.DataAvailable == false znamená, že nejsou žádné bajty připravené k okamžitému čtení. Neznamená to, že je odpověď HTTP dokončena. Smyčka, která se zde zastaví, může během mezery mezi pakety zkrátit zcela normální stahování přes SOCKS.

Poté, co SOCKS naváže připojení TCP, pravidlo dokončení stále určuje rámování HTTP:

  • Tělo s Content-Length končí po deklarovaných bajtech obsahu.
  • Odpověď s chunked kódováním potřebuje závěrečný chunk a příslušné trailery.
  • Odpověď omezená připojením končí spolu s připojením.
  • Některé stavy a odpovědi na HEAD nemají tělo.

Přečtěte stav a hlavičky a určete platné pravidlo. Čekání pouze na uzavření není obecné řešení, protože kompletní odpověď HTTP může ponechat připojení otevřené. Kapacita jednoho bufferu je stejně nesouvisející s délkou odpovědi.

Použijte implementaci rámování HTTP klienta, pokud podporuje zvolený proxy transport. Na kompatibilním moderním runtime .NET zvážte nativní podporu SOCKS v HttpClient. Surová implementace musí udržovat stav parsování napříč částečnými hlavičkami a čteními těla a rozlišovat úspěšné dokončení od zrušení, vypršení časového limitu a neočekávaného EOF. U neprázdného požadavku na čtení znamená nula přečtených bajtů, že proud skončil; to se liší od toho, že v tuto chvíli nejsou ve frontě žádné bajty.

Proxy může časové mezery zviditelnit, ale prázdnou přijímací frontu na značku konce zprávy nezmění.

Související články