Els cossos POST d'un proxy HTTP de Python es poden memoritzar a rfile
Llegeix una sol·licitud de proxy HTTP de Python a través de l'entrada memoritzada del gestor en comptes d'esperar bytes que ja han sortit del búfer del sòcol.
El proxy directe llegeix la línia de sol·licitud i les capçaleres, les reenvia i després espera a select un cos POST. El client ja l'ha enviat. Totes dues bandes semblen esperar l'una l'altra.
Amb BaseHTTPRequestHandler de Python, la lectura de les capçaleres passa per rfile, un flux d'entrada amb memòria intermèdia. Aquest flux pot llegir per endavant i retenir bytes que pertanyen al cos. Esperar al sòcol subjacent només pregunta si el seu descriptor de fitxer està a punt; no pregunta si el flux de Python ja conté dades utilitzables.
Segueix el búfer que va llegir les capçaleres
Llegeix el cos també a través de self.rfile. No canviïs a self.connection.recv després d'analitzar les capçaleres amb el flux amb memòria. En cas contrari, el codi pot saltar-se bytes que aquest flux ja reté i esperar dades que mai no es tornaran a enviar.
Passar rfile mateix a select no fa que select inspeccioni el seu búfer de Python. L'API de disponibilitat funciona a través del descriptor de fitxer de l'objecte.
Per a una sol·licitud amb un Content-Length vàlid i sense Transfer-Encoding, consumeix exactament el nombre de bytes declarat, gestionant el final prematur de l'entrada i els teus límits de mida i temps. No llegeixis fins a EOF: un client amb connexió persistent pot mantenir la connexió oberta després d'acabar la sol·licitud.
Fes que l'enquadrament sigui una part explícita del proxy
Els cossos de sol·licitud fragmentats necessiten suport d'enquadrament fragmentat. No es poden llegir buscant un Content-Length absent. Les metadades de longitud ambigües necessiten una via de rebuig definida, en lloc de triar la capçalera que sembli convenient.
Un gestor blocant pot continuar utilitzant la seva interfície de flux amb lectures limitades. Un proxy dirigit per esdeveniments necessita un model de búfer que integri la lectura per endavant de l'analitzador amb la gestió de disponibilitat. Canviar un temps d'espera no reconciliarà dos consumidors independents del mateix sòcol.
Aquest diagnòstic és específic de on es retenen els bytes entrants. Un cop el proxy ha consumit el cos correcte, encara ha de reenviar aquest cos amb un enquadrament HTTP coherent. El gestor estàndard http.server és un bon lloc per entendre el mecanisme, però no és una implementació de proxy directe de producció.