Python HTTP proxy POST kūnai gali būti buferiuojami rfile
Skaitykite Python HTTP proxy užklausą per apdoroklio buferiuotą įvestį, o ne laukite baitų, kurie jau paliko soketo buferį.
Persiunčiantysis proxy nuskaito užklausos eilutę ir antraštes, persiunčia jas, tada select laukia POST kūno. Klientas jį jau nusiuntė. Atrodo, kad abi pusės laukia viena kitos.
Naudojant Python BaseHTTPRequestHandler, antraščių skaitymas eina per rfile, buferiuotą įvesties srautą. Tas srautas gali skaityti į priekį ir laikyti kūnui priklausančius baitus. Laukimas prie pagrindinio soketo klausia tik, ar jo failo deskriptorius paruoštas; neklausia, ar Python sraute jau yra tinkamų duomenų.
Sekite buferį, kuris nuskaitė antraštes
Kūną skaitykite irgi per self.rfile. Nepereikite prie self.connection.recv, kai antraštes apdorojote buferiuotu srautu. Priešingu atveju kodas gali apeiti to srauto jau laikomus baitus ir laukti duomenų, kurie niekada nebus siunčiami dar kartą.
Perdavus patį rfile į select, select nepradeda tikrinti jo Python buferio. Pasirengimo API veikia per objekto failo deskriptorių.
Užklausai su vienu galiojančiu Content-Length ir be Transfer-Encoding sunaudokite tiksliai deklaruotą baitų skaičių, apdorodami per ankstyvą įvesties pabaigą ir savo dydžio bei laiko ribas. Neskaitzykite iki EOF: klientas su nuolatiniu ryšiu gali palikti ryšį atvirą užbaigęs užklausą.
Padarykite rėminimą aiškia proxy dalimi
Dalomis perduodami užklausos kūnai reikalauja dalimis perduodamo rėminimo palaikymo. Jų negalima skaityti ieškant nesančio Content-Length. Dviprasmiški ilgio metaduomenys reikalauja apibrėžto atmetimo kelio, o ne patogios antraštės pasirinkimo.
Blokuojantis apdoroklis gali toliau naudoti savo srauto sąsają su ribotu skaitymu. Įvykiais valdomas proxy reikalauja buferio modelio, kuris sujungia analizatoriaus skaitymą į priekį su pasirengimo apdorojimu. Laiko limito pakeitimas nesutaikys dviejų nepriklausomų to paties soketo vartotojų.
Ši diagnozė susijusi su tuo, kur laikomi gaunami baitai. Kai proxy sunaudoja tinkamą kūną, jis vis tiek turi persiųsti tą kūną nuosekliu HTTP rėminimu. Standartinis http.server apdoroklis yra naudinga vieta suprasti mechanizmą, bet tai nėra produkcinė persiunčiančiojo proxy realizacija.