I corpi POST di un proxy HTTP Python possono essere bufferizzati in rfile
Leggi una richiesta del proxy HTTP Python attraverso l'input bufferizzato dell'handler invece di attendere byte che hanno già lasciato il buffer del socket.
Il proxy forward legge la riga di richiesta e le intestazioni, le inoltra, poi attende in select un corpo POST. Il client lo ha già inviato. Entrambe le parti sembrano in attesa l'una dell'altra.
Con BaseHTTPRequestHandler di Python, la lettura delle intestazioni passa per rfile, un flusso di input bufferizzato. Quel flusso può leggere in anticipo e trattenere byte che appartengono al corpo. Attendere sul socket sottostante chiede solo se il suo descrittore di file è pronto; non chiede se il flusso Python contiene già dati utilizzabili.
Segui il buffer che ha letto le intestazioni
Leggi il corpo anche tramite self.rfile. Non passare a self.connection.recv dopo aver analizzato le intestazioni con il flusso bufferizzato. Altrimenti il codice può aggirare byte già trattenuti da quel flusso e attendere dati che non verranno mai più inviati.
Passare rfile stesso a select non fa sì che select ispezioni il suo buffer Python. L'API di prontezza funziona tramite il descrittore di file dell'oggetto.
Per una richiesta con un solo Content-Length valido e senza Transfer-Encoding, consuma esattamente il numero dichiarato di byte, gestendo la fine anticipata dell'input e i tuoi limiti di dimensione e tempo. Non leggere fino a EOF: un client con connessione persistente può mantenere la connessione aperta dopo aver terminato la richiesta.
Rendi il framing una parte esplicita del proxy
I corpi di richiesta chunked richiedono il supporto al framing chunked. Non possono essere letti cercando un Content-Length assente. I metadati di lunghezza ambigui richiedono un percorso di rifiuto definito, invece di scegliere l'intestazione che sembra comoda.
Un handler bloccante può continuare a usare la sua interfaccia a flusso con letture limitate. Un proxy guidato da eventi ha bisogno di un modello di buffer che integri la lettura anticipata del parser con la gestione della prontezza. Cambiare un timeout non riconcilierà due consumatori indipendenti dello stesso socket.
Questa diagnosi riguarda specificamente dove vengono trattenuti i byte in ingresso. Una volta che il proxy ha consumato il corpo corretto, deve comunque inoltrarlo con un framing HTTP coerente. L'handler standard http.server è un luogo utile per capire il meccanismo, ma non è un'implementazione di proxy forward per la produzione.