A Python HTTP-proxy POST-törzsei bufferelhetők az rfile-ban
A Python HTTP-proxy kérését a kezelő pufferelt bemenetén keresztül olvassa, ahelyett hogy olyan bájtokra várna, amelyek már elhagyták a socket pufferét.
A továbbító proxy beolvassa a kérés sort és a fejléceket, továbbítja őket, majd a selectben egy POST-törzsre vár. A kliens már elküldte. Mindkét fél úgy tűnik, a másikra vár.
A Python BaseHTTPRequestHandlerével a fejlécek olvasása a rfile-n keresztül történik, amely pufferelt bemeneti adatfolyam. Ez az adatfolyam előreolvashat, és a törzshöz tartozó bájtokat tarthat. Az alatta lévő socketre várás csak azt kérdezi, készen áll-e a fájlleírója; nem kérdezi, hogy a Python adatfolyam már tartalmaz-e használható adatot.
Kövesse azt a puffert, amely a fejléceket olvasta
A törzset is a self.rfile-n keresztül olvassa. Ne váltson self.connection.recv-ra, miután a fejléceket a pufferelt adatfolyammal feldolgozta. Ellenkező esetben a kód megkerülheti az adatfolyam által már tartott bájtokat, és olyan adatokra várhat, amelyeket soha többé nem küldenek el.
Az rfile átadása a selectnek nem készteti a selectet a Python puffere vizsgálatára. A készenléti API az objektum fájlleíróján keresztül működik.
Egyetlen érvényes Content-Length-cel rendelkező és Transfer-Encoding nélküli kérésnél pontosan a bejelentett bájtszámot fogyassza el, kezelve a bemenet idő előtti végét, valamint a méret- és időkorlátokat. Ne olvasson az EOF-ig: az állandó kapcsolatot használó kliens a kérés befejezése után is nyitva tarthatja a kapcsolatot.
Tegye a keretezést a proxy kifejezett részévé
A darabolt kéréstörzsekhez darabolt keretezési támogatás kell. Nem olvashatók egy hiányzó Content-Length keresésével. A kétértelmű hosszúsági metaadatokhoz meghatározott elutasítási útvonal kell, ahelyett hogy a kényelmesnek tűnő fejlécet választanánk.
A blokkoló kezelő továbbra is használhatja adatfolyam-interfészét korlátozott olvasásokkal. Az eseményvezérelt proxynak olyan puffermodellre van szüksége, amely integrálja az elemző előreolvasását a készenlét kezelésével. Az időkorlát megváltoztatása nem békíti össze ugyanazon socket két független fogyasztóját.
Ez a diagnózis arra vonatkozik, hol tartják a bejövő bájtokat. Miután a proxy elfogyasztotta a megfelelő törzset, még tovább kell továbbítania azt konzisztens HTTP-keretezéssel. A szabványos http.server kezelő hasznos hely a mechanizmus megértéséhez, de nem termelési továbbítóproxy-implementáció.