Tela POST v HTTP proxy v Pythone možno ukladať do rfile
Čítajte požiadavku HTTP proxy v Pythone cez bufferovaný vstup handlera namiesto čakania na bajty, ktoré už opustili buffer socketu.
Dopredný proxy prečíta riadok požiadavky a hlavičky, prepošle ich a potom v select čaká na telo POST. Klient ho už odoslal. Obe strany vyzerajú, akoby čakali jedna na druhú.
Pri BaseHTTPRequestHandler v Pythone čítanie hlavičiek prechádza cez rfile, bufferovaný vstupný prúd. Ten prúd môže čítať dopredu a držať bajty patriace telu. Čakanie na podkladový socket sa pýta len, či je jeho deskriptor súboru pripravený; nepýta sa, či prúd Pythonu už obsahuje použiteľné dáta.
Nasledujte buffer, ktorý prečítal hlavičky
Čítajte telo tiež cez self.rfile. Neprepínajte na self.connection.recv po spracovaní hlavičiek bufferovaným prúdom. Inak môže kód obísť bajty, ktoré prúd už drží, a čakať na dáta, ktoré už nikdy nebudú odoslané.
Odovzdanie samotného rfile do select nespôsobí, že select preskúma jeho buffer v Pythone. API pripravenosti pracuje cez deskriptor súboru objektu.
Pri požiadavke s jedným platným Content-Length a bez Transfer-Encoding spotrebujte presne deklarovaný počet bajtov, ošetrite predčasný koniec vstupu aj svoje limity veľkosti a času. Nečítajte do EOF: klient s trvalým pripojením môže po dokončení požiadavky nechať pripojenie otvorené.
Urobte z rámovania explicitnú súčasť proxy
Chunked tela požiadaviek potrebujú podporu chunked rámovania. Nemožno ich čítať hľadaním chýbajúceho Content-Length. Nejednoznačné metadáta dĺžky potrebujú definovanú cestu odmietnutia, namiesto výberu hlavičky, ktorá sa zdá pohodlná.
Blokujúci handler môže ďalej používať svoje rozhranie prúdu s obmedzeným čítaním. Proxy riadený udalosťami potrebuje model bufferu, ktorý integruje predbežné čítanie parsera so správou pripravenosti. Zmena časového limitu nezmieri dvoch nezávislých konzumentov toho istého socketu.
Táto diagnóza sa týka toho, kde sú prichádzajúce bajty držané. Keď proxy spotrebuje správne telo, stále ho musí preposlať s konzistentným HTTP rámovaním. Štandardný handler http.server je užitočné miesto na pochopenie mechanizmu, ale nie je produkčnou implementáciou dopredného proxy.