POST tijela Python HTTP proxyja mogu se baferirati u rfile
Čitajte zahtjev Python HTTP proxyja kroz baferirani ulaz rukovaoca umjesto da čekate bajtove koji su već napustili bafer socketa.
Prednji proxy čita liniju zahtjeva i zaglavlja, prosljeđuje ih, a zatim u select čeka POST tijelo. Klijent ga je već poslao. Obje strane izgledaju kao da čekaju jedna drugu.
S Pythonovim BaseHTTPRequestHandler čitanje zaglavlja ide kroz rfile, baferirani ulazni tok. Taj tok može čitati unaprijed i držati bajtove koji pripadaju tijelu. Čekanje na osnovni socket samo pita je li njegov deskriptor datoteke spreman; ne pita sadrži li Python tok već upotrebljive podatke.
Slijedite bafer koji je pročitao zaglavlja
Čitajte tijelo i kroz self.rfile. Ne prelazite na self.connection.recv nakon što zaglavlja parsirate baferiranim tokom. Inače kod može zaobići bajtove koje taj tok već drži i čekati podatke koji nikada više neće biti poslani.
Prosljeđivanje samog rfilea u select ne tjera select da pregleda njegov Python bafer. API spremnosti radi kroz deskriptor datoteke objekta.
Za zahtjev s jednim valjanim Content-Length i bez Transfer-Encoding, potrošite tačno deklarirani broj bajtova, obrađujući prerani kraj ulaza i svoja ograničenja veličine i vremena. Ne čitajte do EOF: klijent s trajnom vezom može ostaviti vezu otvorenom nakon završetka zahtjeva.
Učinite uokvirivanje eksplicitnim dijelom proxyja
Chunked tijela zahtjeva trebaju podršku chunked uokvirivanja. Ne mogu se čitati traženjem Content-Lengtha koji nedostaje. Dvosmisleni metapodaci o dužini trebaju definiran put odbijanja, umjesto odabira zaglavlja koje se čini prikladnim.
Blokirajući rukovalac može nastaviti koristiti svoje sučelje toka s ograničenim čitanjima. Proxy vođen događajima treba model bafera koji integrira parserovo čitanje unaprijed s upravljanjem spremnošću. Promjena vremenskog ograničenja neće pomiriti dva neovisna potrošača istog socketa.
Ova je dijagnoza specifična za to gdje se drže dolazni bajtovi. Nakon što proxy potroši ispravno tijelo, još ga mora proslijediti s dosljednim HTTP uokvirivanjem. Standardni rukovalac http.server korisno je mjesto za razumijevanje mehanizma, ali nije produkcijska implementacija prednjeg proxyja.