NetworkStream.DataAvailable ei merkitse HTTP-vastauksen loppua
Estä katkaistut HTTP-lataukset käyttämällä viestikehystystä NetworkStream.DataAvailablein sijaan lopetusehtona.
NetworkStream.DataAvailable == false tarkoittaa, ettei yhtään tavua ole heti luettavissa. Se ei tarkoita, että HTTP-vastaus on valmis. Siihen pysähtyvä silmukka voi katkaista täysin normaalin SOCKS-latauksen pakettien välisen tauon aikana.
Kun SOCKS on muodostanut TCP-yhteyden, HTTP-kehystys antaa edelleen valmistumissäännön:
- Content-Length-runko päättyy ilmoitettujen sisältötavujen jälkeen.
- Chunked-vastaus tarvitsee päättävän chunkin ja soveltuvat trailerit.
- Yhteyteen rajattu vastaus päättyy yhteyden mukana.
- Joillakin tilakoodeilla ja HEAD-vastauksilla ei ole runkoa.
Lue tila ja otsakkeet ja määritä soveltuva sääntö. Pelkän sulkeutumisen odottaminen ei ole yleisratkaisu, koska valmis HTTP-vastaus voi jättää yhteyden auki. Yhden puskurin kapasiteetti ei liity vastauksen pituuteen.
Käytä HTTP-asiakasohjelman kehystysratkaisua, kun se tukee valittua välityspalvelinliikennettä. Yhteensopivassa nykyaikaisessa .NET-ajoympäristössä harkitse HttpClientin natiivia SOCKS-tukea. Raaka toteutus ei saa menettää jäsennystilaa osittaisten otsakkeiden ja runkojen lukujen välillä, ja sen on erotettava onnistunut valmistuminen peruutuksesta, aikakatkaisusta ja odottamattomasta EOF:stä. Ei-tyhjässä lukupyynnössä nolla luettua tavua tarkoittaa, että virta on päättynyt; tämä eroaa siitä, ettei jonossa ole juuri nyt tavuja.
Välityspalvelin voi tehdä ajoituskatkoksista näkyviä, mutta se ei muuta tyhjää vastaanottojonoa viestin lopun merkiksi.