Pārsūtošais starpniekserveris nolasa pieprasījuma rindu un galvenes, pārsūta tās, pēc tam select gaida POST pamattekstu. Klients to jau ir nosūtījis. Abas puses izskatās, ka gaida viena otru.

Ar Python BaseHTTPRequestHandler galveņu lasīšana iet caur rfile, buferētu ievades plūsmu. Šī plūsma var lasīt uz priekšu un turēt pamattekstam piederošos baitus. Gaidīšana uz pamata ligzdu tikai jautā, vai tās faila deskriptors ir gatavs; tā nejautā, vai Python plūsmā jau ir izmantojami dati.

Sekojiet buferim, kas nolasīja galvenes

Lasiet pamattekstu arī caur self.rfile. Nepārslēdzieties uz self.connection.recv pēc galveņu apstrādes ar buferēto plūsmu. Citādi kods var apiet šīs plūsmas jau turētos baitus un gaidīt datus, kas vairs nekad netiks nosūtīti.

Pati rfile nodošana select nenozīmē, ka select pārbaudīs tā Python buferi. Gatavības API darbojas caur objekta faila deskriptoru.

Pieprasījumam ar vienu derīgu Content-Length un bez Transfer-Encoding patērējiet tieši deklarēto baitu skaitu, apstrādājot priekšlaicīgu ievades beigu un savus izmēra un laika ierobežojumus. Nelasiet līdz EOF: klients ar pastāvīgu savienojumu var atstāt savienojumu atvērtu pēc pieprasījuma pabeigšanas.

Padariet ietvaru par skaidru starpniekservera daļu

Sadalītiem pieprasījuma pamattekstiem nepieciešams sadalīts ietvara atbalsts. Tos nevar nolasīt, meklējot trūkstošu Content-Length. Neviennozīmīgi garuma metadati prasa noteiktu noraidīšanas ceļu, nevis ērtākās galvenes izvēli.

Bloķējošs apstrādātājs var turpināt izmantot savu plūsmas saskarni ar ierobežotu lasīšanu. Notikumdrivenam starpniekserverim nepieciešams bufera modelis, kas apvieno parsētāja lasīšanu uz priekšu ar gatavības apstrādi. Taimauta maiņa nesamierinās divus neatkarīgus vienas ligzdas patērētājus.

Šī diagnoze attiecas uz to, kur tiek turēti ienākošie baiti. Kad starpniekserveris ir patērējis pareizo pamattekstu, tam tas vēl jāpārsūta ar konsekventu HTTP ietvaru. Standarta http.server apstrādātājs ir noderīga vieta, lai saprastu mehānismu, bet tas nav ražošanas pārsūtošā starpniekservera ieviešana.

Saistītie raksti