POST-kroppar i ein Python HTTP-proxy kan bufreast i rfile
Les ein Python HTTP-proxyførespurnad gjennom den bufra inndataa til handteraren i staden for å vente på byte som alt har forlate socketbufferen.
Vidaresendingsproxyen les førespurnadslinja og hovuda, sender dei vidare og ventar deretter i select på ein POST-kropp. Klienten har alt sendt han. Begge sider ser ut til å vente på kvarandre.
Med Pythons BaseHTTPRequestHandler går lesinga av hovuda gjennom rfile, ein bufra inndatastraum. Den straumen kan lese framover og halde byte som høyrer til kroppen. Å vente på den underliggjande socketen spør berre om filskildringa er klar; det spør ikkje om Python-straumen alt inneheld brukbare data.
Følg bufferen som las hovuda
Les kroppen òg gjennom self.rfile. Ikkje byt til self.connection.recv etter at du har parsa hovuda med den bufra straumen. Elles kan koden hoppe over byte som straumen alt held, og vente på data som aldri blir sende igjen.
Å gje rfile sjølv til select får ikkje select til å granske Python-bufferen. Klarheits-API-et arbeider gjennom filskildringa til objektet.
For ein førespurnad med éin gyldig Content-Length og ingen Transfer-Encoding, bruk nøyaktig det oppgjevne talet på byte, og handter tidleg slutt på inndata samt storleiks- og tidsgrensene dine. Ikkje les til EOF: ein klient med varig tilkopling kan halde tilkoplinga open etter at førespurnaden er ferdig.
Gjer innramming til ein eksplisitt del av proxyen
Chunka førespurnadskroppar treng støtte for chunka innramming. Dei kan ikkje lesast ved å leite etter ein Content-Length som manglar. Tvitydig lengdemetadata treng ein definert avvisingveg, i staden for å velje det hovudet som verkar praktisk.
Ein blokkerande handterar kan halde fram med å bruke straumgrensesnittet sitt med avgrensa lesingar. Ein hendingsstyrt proxy treng ein buffermodell som integrerer førehandlesing frå parsaren med klarheitshandtering. Å endre ein timeout forlikar ikkje to uavhengige brukarar av same socket.
Denne diagnosen gjeld spesifikt kvar dei innkommande byta blir haldne. Når proxyen har brukt den rette kroppen, må han framleis sende den kroppen vidare med konsistent HTTP-innramming. Den standard http.server-handteraren er ein nyttig stad å forstå mekanismen, men han er ikkje ein produksjonsimplementasjon av ein vidaresendingsproxy.