POST-bodies i Python HTTP-proxy kan bufres i rfile
Læs en Python HTTP-proxyanmodning gennem handlerens bufrede input i stedet for at vente på bytes, der allerede har forladt socketbufferen.
Forward-proxyen læser anmodningslinjen og headere, videresender dem og venter derefter i select på en POST-body. Klienten har allerede sendt den. Begge sider ser ud til at vente på hinanden.
Med Pythons BaseHTTPRequestHandler går læsningen af headere gennem rfile, en bufret inputstrøm. Den strøm kan læse forud og holde bytes, der hører til bodyen. At vente på den underliggende socket spørger kun, om dens fildeskriptor er klar; det spørger ikke, om Python-strømmen allerede indeholder brugbare data.
Følg den buffer, der læste headere
Læs også bodyen gennem self.rfile. Skift ikke til self.connection.recv, efter at headerne er parset med den bufrede strøm. Ellers kan koden springe bytes over, som strømmen allerede holder, og vente på data, der aldrig sendes igen.
At give rfile selv til select får ikke select til at undersøge dens Python-buffer. Paratheds-API'et arbejder gennem objektets fildeskriptor.
For en anmodning med én gyldig Content-Length og ingen Transfer-Encoding skal du forbruge præcis det deklarerede antal bytes og håndtere for tidlig slutning på input samt dine størrelses- og tidsgrænser. Læs ikke til EOF: en klient med vedvarende forbindelse kan holde forbindelsen åben, efter anmodningen er færdig.
Gør framing til en eksplicit del af proxyen
Chunkede anmodningsbodies kræver understøttelse af chunket framing. De kan ikke læses ved at lede efter en Content-Length, der mangler. Tvetydige længdemetadata kræver en defineret afvisningsvej i stedet for at vælge den header, der virker bekvem.
En blokerende handler kan fortsætte med at bruge sin strømgrænseflade med afgrænsede læsninger. En hændelsesdrevet proxy kræver en buffermodel, der integrerer parserens forudlæsning med parathedshåndtering. Ændring af en timeout forliger ikke to uafhængige forbrugere af samme socket.
Denne diagnose er specifik for, hvor de indgående bytes holdes. Når proxyen har forbrugt den rigtige body, skal den stadig videresende den body med konsistent HTTP-framing. Den standard http.server-handler er et nyttigt sted at forstå mekanismen, men den er ikke en produktionsimplementering af en forward-proxy.