Corpurile POST ale unui proxy HTTP Python pot fi tamponate în rfile
Citiți o cerere a proxy-ului HTTP Python prin intrarea tamponată a handlerului în loc să așteptați octeți care au părăsit deja tamponul socketului.
Proxy-ul de redirecționare citește linia cererii și anteturile, le redirecționează, apoi așteaptă în select un corp POST. Clientul l-a trimis deja. Ambele părți par să aștepte una pe cealaltă.
Cu BaseHTTPRequestHandler din Python, citirea anteturilor trece prin rfile, un flux de intrare tamponat. Acel flux poate citi în avans și reține octeți care aparțin corpului. Așteptarea pe socketul de bază întreabă doar dacă descriptorul său de fișier este pregătit; nu întreabă dacă fluxul Python conține deja date utilizabile.
Urmați tamponul care a citit anteturile
Citiți corpul tot prin self.rfile. Nu treceți la self.connection.recv după ce ați analizat anteturile cu fluxul tamponat. Altfel codul poate ocoli octeții deja reținuți de acel flux și poate aștepta date care nu vor mai fi trimise niciodată.
Transmiterea rfile însuși către select nu face select să-i inspecteze tamponul Python. API-ul de disponibilitate funcționează prin descriptorul de fișier al obiectului.
Pentru o cerere cu un singur Content-Length valid și fără Transfer-Encoding, consumați exact numărul declarat de octeți, tratând sfârșitul prematur al intrării și limitele dvs. de dimensiune și timp. Nu citiți până la EOF: un client cu conexiune persistentă poate lăsa conexiunea deschisă după terminarea cererii.
Faceți încadrarea o parte explicită a proxy-ului
Corpurile de cerere chunked necesită suport pentru încadrare chunked. Nu pot fi citite căutând un Content-Length absent. Metadatele de lungime ambigue necesită o cale de respingere definită, în loc să alegeți antetul care pare convenabil.
Un handler blocant poate continua să folosească interfața sa de flux cu citiri limitate. Un proxy condus de evenimente are nevoie de un model de tampon care integrează citirea în avans a parserului cu gestionarea disponibilității. Schimbarea unui timeout nu va împăca doi consumatori independenți ai aceluiași socket.
Acest diagnostic este specific locului unde sunt reținuți octeții de intrare. După ce proxy-ul a consumat corpul corect, încă trebuie să redirecționeze acel corp cu o încadrare HTTP consecventă. Handlerul standard http.server este un loc util pentru a înțelege mecanismul, dar nu este o implementare de proxy de redirecționare pentru producție.