Eteenpäin välittävä välityspalvelin lukee pyyntörivin ja otsikot, välittää ne ja odottaa sitten selectissä POST-runkoa. Asiakas on jo lähettänyt sen. Molemmat osapuolet näyttävät odottavan toisiaan.

Pythonin BaseHTTPRequestHandlerissa otsikoiden lukeminen kulkee rfile:n kautta, joka on puskuroitu syötevirta. Se virta voi lukea edelle ja pitää runkoon kuuluvia tavuja. Taustalla olevan socketin odottaminen kysyy vain, onko sen tiedostokuvaus valmis; se ei kysy, sisältääkö Python-virta jo käyttökelpoista dataa.

Seuraa puskuria, joka luki otsikot

Lue runko myös self.rfile:n kautta. Älä vaihda self.connection.recv:een, kun olet jäsentänyt otsikot puskuroidulla virralla. Muuten koodi voi ohittaa tavut, jotka virta jo pitää, ja odottaa dataa, jota ei koskaan enää lähetetä.

rfilen itsensä antaminen selectille ei saa selectiä tutkimaan sen Python-puskuria. Valmius-API toimii objektin tiedostokuvauksen kautta.

Pyynnölle, jossa on yksi kelvollinen Content-Length eikä Transfer-Encodingiä, kuluta täsmälleen ilmoitettu tavumäärä ja käsittele syötteen ennenaikainen loppu sekä koko- ja aikarajasi. Älä lue EOF:ään asti: pysyvää yhteyttä käyttävä asiakas voi pitää yhteyden auki pyynnön päätyttyä.

Tee kehystyksestä välityspalvelimen eksplisiittinen osa

Paloitellut pyyntörungot tarvitsevat paloitellun kehystyksen tuen. Niitä ei voi lukea etsimällä puuttuvaa Content-Lengthiä. Monitulkintainen pituusmetatieto tarvitsee määritellyn hylkäyspolun sen sijaan, että valitaan kätevältä vaikuttava otsikko.

Estävä käsittelijä voi jatkaa virtaliittymänsä käyttöä rajoitetuilla luvuilla. Tapahtumaohjattu välityspalvelin tarvitsee puskurimallin, joka yhdistää jäsentimen ennakkoluvun valmiuden käsittelyyn. Aikakatkaisun muuttaminen ei sovita yhteen kahta riippumatonta saman socketin kuluttajaa.

Tämä diagnoosi koskee sitä, missä saapuvat tavut pidetään. Kun välityspalvelin on kuluttanut oikean rungon, sen on yhä välitettävä se johdonmukaisella HTTP-kehystyksellä. Standardi http.server-käsittelijä on hyödyllinen paikka ymmärtää mekanismi, mutta se ei ole tuotantokelpoinen eteenpäin välittävän välityspalvelimen toteutus.

Aiheeseen liittyvät artikkelit