Telesa POST v Pythonovem proxy HTTP se lahko medpomnijo v rfile
Preberite zahtevo Pythonovega proxyja HTTP skozi medpomnilnik vhoda v obdelovalniku, namesto da bi čakali na bajte, ki so medpomnilnik vtičnice že zapustili.
Posredniški proxy prebere vrstico zahteve in glave, jih posreduje in nato v select čaka na telo POST. Odjemalec ga je že poslal. Obe strani se zdita, kot da čakata druga na drugo.
Pri BaseHTTPRequestHandler v Pythonu branje glav poteka skozi rfile, medpomnjen vhodni tok. Ta tok lahko bere naprej in zadrži bajte, ki pripadajo telesu. Čakanje na osnovno vtičnico vpraša le, ali je njen opisovalec datoteke pripravljen; ne vpraša, ali tok Python že vsebuje uporabne podatke.
Sledite medpomnilniku, ki je prebral glave
Telo berite tudi skozi self.rfile. Ne preklopite na self.connection.recv, potem ko ste glave razčlenili z medpomnjenim tokom. Sicer lahko koda zaobide bajte, ki jih tok že zadržuje, in čaka na podatke, ki ne bodo nikoli več poslani.
Posredovanje samega rfile v select ne povzroči, da bi select pregledal njegov medpomnilnik Python. API pripravljenosti deluje skozi opisovalec datoteke predmeta.
Za zahtevo z enim veljavnim Content-Length in brez Transfer-Encoding porabite natanko navedeno število bajtov, pri tem pa obravnavajte prezgodnji konec vhoda ter svoje omejitve velikosti in časa. Ne berite do EOF: odjemalec s trajno povezavo lahko po končani zahtevi povezavo pusti odprto.
Naredite uokvirjanje izrecni del proxyja
Razdeljena telesa zahtev potrebujejo podporo razdeljenega uokvirjanja. Ni jih mogoče brati z iskanjem manjkajočega Content-Length. Dvoumni metapodatki o dolžini potrebujejo določeno pot zavrnitve, namesto da bi izbrali glavo, ki se zdi priročna.
Blokirajoči obdelovalnik lahko še naprej uporablja svoj vmesnik toka z omejenimi branji. Proxy, ki ga vodijo dogodki, potrebuje model medpomnilnika, ki povezuje branje razčlenjevalnika naprej z obravnavo pripravljenosti. Sprememba časovne omejitve ne bo uskladila dveh neodvisnih porabnikov iste vtičnice.
Ta diagnoza je posebna glede na to, kje so vhodni bajti zadržani. Ko proxy porabi pravo telo, ga mora še vedno posredovati s doslednim uokvirjanjem HTTP. Standardni obdelovalnik http.server je koristno mesto za razumevanje mehanizma, vendar ni produkcijska izvedba posredniškega proxyja.