Les corps POST d'un proxy HTTP Python peuvent être mis en tampon dans rfile
Lisez une requête de proxy HTTP Python via l'entrée tamponnée du handler au lieu d'attendre des octets qui ont déjà quitté le tampon de la socket.
Le proxy direct lit la ligne de requête et les en-têtes, les transmet, puis attend dans select un corps POST. Le client l'a déjà envoyé. Les deux côtés semblent attendre l'autre.
Avec BaseHTTPRequestHandler de Python, la lecture des en-têtes passe par rfile, un flux d'entrée tamponné. Ce flux peut lire en avance et retenir des octets appartenant au corps. Attendre sur la socket sous-jacente demande seulement si son descripteur de fichier est prêt ; cela ne demande pas si le flux Python contient déjà des données utilisables.
Suivez le tampon qui a lu les en-têtes
Lisez aussi le corps via self.rfile. Ne passez pas à self.connection.recv après avoir analysé les en-têtes avec le flux tamponné. Sinon, le code peut contourner des octets déjà retenus par ce flux et attendre des données qui ne seront jamais renvoyées.
Passer rfile lui-même à select n'amène pas select à inspecter son tampon Python. L'API de disponibilité fonctionne via le descripteur de fichier de l'objet.
Pour une requête avec un seul Content-Length valide et sans Transfer-Encoding, consommez exactement le nombre d'octets déclaré, en gérant la fin prématurée de l'entrée ainsi que vos limites de taille et de temps. Ne lisez pas jusqu'à EOF : un client utilisant une connexion persistante peut garder la connexion ouverte après avoir terminé la requête.
Faites du framing une partie explicite du proxy
Les corps de requête chunked nécessitent la prise en charge du framing chunked. Ils ne peuvent pas être lus en cherchant un Content-Length absent. Des métadonnées de longueur ambiguës nécessitent un chemin de rejet défini, plutôt que de choisir l'en-tête qui semble commode.
Un handler bloquant peut continuer d'utiliser son interface de flux avec des lectures bornées. Un proxy événementiel a besoin d'un modèle de tampon qui intègre la lecture anticipée de l'analyseur à la gestion de la disponibilité. Changer un délai d'attente ne réconciliera pas deux consommateurs indépendants de la même socket.
Ce diagnostic porte précisément sur l'endroit où sont retenus les octets entrants. Une fois que le proxy a consommé le bon corps, il doit encore le transmettre avec un framing HTTP cohérent. Le handler standard http.server est un bon endroit pour comprendre le mécanisme, mais ce n'est pas une implémentation de proxy direct de production.