NetworkStream.DataAvailable == false pomeni, da ni bajtov, pripravljenih za takojšnje branje. To ne pomeni, da je odgovor HTTP dokončan. Zanka, ki se tam ustavi, lahko med vrzeljo med paketi odreže povsem običajen prenos prek SOCKS.

Ko SOCKS vzpostavi povezavo TCP, pravilo dokončanja še vedno določa okvirjanje HTTP:

  • Telo s Content-Length se konča po objavljenih bajtih vsebine.
  • Odgovor chunked potrebuje zaključni chunk in ustrezne trailerje.
  • Odgovor, omejen s povezavo, se konča s povezavo.
  • Nekateri statusi in odgovori na HEAD nimajo telesa.

Preberite status in glave, da določite veljavno pravilo. Čakanje samo na zaprtje ni splošna rešitev, ker lahko popoln odgovor HTTP pusti povezavo odprto. Tudi zmogljivost enega medpomnilnika ni povezana z dolžino odgovora.

Uporabite izvedbo okvirjanja odjemalca HTTP, ko podpira izbrani prenos prek posrednika. V združljivem sodobnem izvajalnem okolju .NET razmislite o vgrajeni podpori SOCKS v HttpClient. Surova izvedba mora ohraniti stanje razčlenjevanja med delnimi glavami in branji telesa ter razlikovati uspešno dokončanje od preklica, časovne omejitve in nepričakovanega EOF. Pri zahtevi za branje, ki ni prazna, nič prebranih bajtov pomeni, da se je tok končal; to se razlikuje od tega, da v čakalni vrsti trenutno ni bajtov.

Posrednik lahko naredi časovne vrzeli opazne, a prazne sprejemne vrste ne spremeni v oznako konca sporočila.

Sorodni članki