POST tijela Python HTTP proxyja mogu se baferisati u rfile
Čitajte zahtjev Python HTTP proxyja kroz baferisani ulaz rukovatelja umjesto da čekate bajtove koji su već napustili bafer soketa.
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, baferisani ulazni tok. Taj tok može čitati unaprijed i držati bajtove koji pripadaju tijelu. Čekanje na osnovni soket samo pita je li njegov datotečni deskriptor 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 baferisanim 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 datotečni deskriptor objekta.
Za zahtjev s jednim valjanim Content-Length i bez Transfer-Encoding, potrošite toč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 rukovatelj 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 vremenske odsječke neće pomiriti dva neovisna potrošača istog soketa.
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 rukovatelj http.server korisno je mjesto za razumijevanje mehanizma, ali nije produkcijska implementacija prednjeg proxyja.