Proxy përpara lexon rreshtin e kërkesës dhe titujt, i përcjell, pastaj pret në select një trup POST. Klienti e ka dërguar tashmë. Të dyja palët duken sikur presin njëra-tjetrën.

Me BaseHTTPRequestHandler të Python, leximi i titujve kalon përmes rfile, një rrjedhë hyrëse e buferuar. Ajo rrjedhë mund të lexojë përpara dhe të mbajë bajt që i përkasin trupit. Pritja në soketin themelor pyet vetëm nëse përshkruesi i skedarit është gati; nuk pyet nëse rrjedha Python përmban tashmë të dhëna të përdorshme.

Ndiqni buferin që lexoi titujt

Lexoni trupin edhe përmes self.rfile. Mos kaloni në self.connection.recv pasi të keni analizuar titujt me rrjedhën e buferuar. Përndryshe kodi mund të anashkalojë bajt që ajo rrjedhë mban tashmë dhe të presë të dhëna që nuk do të dërgohen më kurrë.

Kalimi i vetë rfile te select nuk e bën select të kontrollojë buferin e tij Python. API i gatishmërisë punon përmes përshkruesit të skedarit të objektit.

Për një kërkesë me një Content-Length të vlefshëm dhe pa Transfer-Encoding, konsumoni saktësisht numrin e deklaruar të bajteve, duke trajtuar fundin e parakohshëm të hyrjes dhe kufijtë tuaj të madhësisë e të kohës. Mos lexoni deri në EOF: një klient me lidhje të vazhdueshme mund ta lërë lidhjen hapur pas përfundimit të kërkesës.

Bëni kornizimin një pjesë të qartë të proxy-t

Trupat e kërkesave chunked kërkojnë mbështetje për kornizim chunked. Nuk mund të lexohen duke kërkuar një Content-Length që mungon. Metadatat e gjatësisë të paqarta kërkojnë një rrugë të përcaktuar refuzimi, në vend të zgjedhjes së titullit që duket i përshtatshëm.

Një trajtues bllokues mund të vazhdojë të përdorë ndërfaqen e rrjedhës me lexime të kufizuara. Një proxy i drejtuar nga ngjarje kërkon një model buferi që integron leximin përpara të analizuesit me trajtimin e gatishmërisë. Ndryshimi i një afati nuk do të pajtojë dy konsumatorë të pavarur të të njëjtit soket.

Kjo diagnozë është specifike për vendin ku mbahen bajtët hyrës. Pasi proxy të ketë konsumuar trupin e duhur, ai ende duhet ta përcjellë atë trup me kornizim HTTP të qëndrueshëm. Trajtuesi standard http.server është një vend i dobishëm për të kuptuar mekanizmin, por nuk është një zbatim prodhimi i një proxy përpara.

Artikuj të ngjashëm