NetworkStream.DataAvailable neatzīmē HTTP atbildes beigas
Novērsiet saīsinātas HTTP lejupielādes, izmantojot ziņojumu ietvarošo struktūru, nevis NetworkStream.DataAvailable kā beigu nosacījumu.
NetworkStream.DataAvailable == false nozīmē, ka nav baitu, kas būtu gatavi tūlītējai lasīšanai. Tas nenozīmē, ka HTTP atbilde ir pabeigta. Cikls, kas tur apstājas, var pārtraukt pilnīgi normālu SOCKS lejupielādi starpā starp paketēm.
Pēc tam, kad SOCKS izveido TCP savienojumu, pabeigšanas noteikumu joprojām nosaka HTTP ietvars:
- Content-Length pamatteksts beidzas pēc deklarētajiem satura baitiem.
- Chunked atbildei ir vajadzīgs noslēdzošais chunk un attiecīgie trailers.
- Ar savienojumu noteiktā atbilde beidzas kopā ar savienojumu.
- Dažiem statusiem un atbildēm uz HEAD nav pamatteksta.
Lasiet statusu un galvenes, lai noteiktu piemērojamo noteikumu. Gaidīt tikai aizvēršanu nav vispārējs risinājums, jo pilnīga HTTP atbilde var atstāt savienojumu atvērtu. Arī viena bufera ietilpība nav saistīta ar atbildes garumu.
Izmantojiet HTTP klienta ietvara ieviešanu, ja tā atbalsta izvēlēto starpniekservera transportu. Saderīgā mūsdienīgā .NET izpildlaikā apsveriet HttpClient iebūvēto SOCKS atbalstu. Nepabeigtai ieviešanai ir jāsaglabā parsēšanas stāvoklis starp daļējām galvenēm un pamatteksta lasījumiem, kā arī jānošķir veiksmīga pabeigšana no atcelšanas, taimauta un negaidīta EOF. Ne tukšā lasīšanas pieprasījumā nulle nolasītu baitu nozīmē, ka straume ir beigusies; tas atšķiras no tā, ka šobrīd rindā nav baitu.
Starpniekserveris var padarīt laika starpas pamanāmas, taču tas nepārvērš tukšu saņemšanas rindu ziņojuma beigu atzīmē.