POST-liggame van 'n Python HTTP-proksie kan in rfile gebuffer word
Lees 'n Python HTTP-proksieversoek deur die handler se gebufferde invoer eerder as om te wag vir grepe wat reeds die sokketbuffer verlaat het.
Die vorentoe-proksie lees die versoeklyn en opkoppe, stuur dit aan, en wag dan in select vir 'n POST-liggaam. Die kliënt het dit reeds gestuur. Albei kante lyk asof hulle op mekaar wag.
Met Python se BaseHTTPRequestHandler gaan die lees van die opkoppe deur rfile, 'n gebufferde invoerstroom. Daardie stroom kan vooruit lees en grepe hou wat aan die liggaam behoort. Om op die onderliggende sokket te wag, vra net of sy lêerbeskrywer gereed is; dit vra nie of die Python-stroom reeds bruikbare data bevat nie.
Volg die buffer wat die opkoppe gelees het
Lees die liggaam ook deur self.rfile. Moenie na self.connection.recv oorskakel nadat die opkoppe met die gebufferde stroom ontleed is nie. Anders kan die kode grepe wat daardie stroom reeds hou, oorslaan en wag vir data wat nooit weer gestuur sal word nie.
Om rfile self aan select te gee, maak nie dat select sy Python-buffer ondersoek nie. Die gereedheids-API werk deur die objek se lêerbeskrywer.
Vir 'n versoek met een geldige Content-Length en geen Transfer-Encoding, verbruik presies die verklaarde aantal grepe, en hanteer voortydige einde van invoer en jou grootte- en tydgrense. Moenie tot EOF lees nie: 'n kliënt met 'n blywende verbinding kan die verbinding oop hou nadat die versoek klaar is.
Maak raamwerk 'n eksplisiete deel van die proksie
Gechunkte versoekliggame benodig gechunkte raamwerkondersteuning. Hulle kan nie gelees word deur te soek na 'n Content-Length wat afwesig is nie. Dubbelsinnige lengte-metadata benodig 'n gedefinieerde verwerpingspad, eerder as om die opkop te kies wat gerieflik lyk.
'n Blokkerende handler kan sy stroomkoppelvlak bly gebruik met begrensde lesings. 'n Gebeuregedrewe proksie benodig 'n buffermodel wat die ontleder se vooruit-lees met gereedheidshanterings integreer. Om 'n tydsperdatum te verander, sal nie twee onafhanklike verbruikers van dieselfde sokket versoen nie.
Hierdie diagnose is spesifiek vir waar die inkomende grepe gehou word. Sodra die proksie die regte liggaam verbruik het, moet dit steeds daardie liggaam met konsekwente HTTP-raamwerk aanstuur. Die standaard http.server-hantererder is 'n nuttige plek om die meganisme te verstaan, maar dit is nie 'n produksie-vorentoe-proksie-implementering nie.