Zpracování EOF ve čtecí smyčce SOCKS v Pythonu
Zpracujte EOF explicitně ve smyčce přesného čtení SOCKS, místo abyste uzavřené spojení považovali za časový limit, který nikdy nepřijde.
Smyčka chce osm bajtů odpovědi SOCKS. Dostala tři. Další čtení vrátí b'', smyčka ho přidá, zkontroluje délku a zkouší to znovu donekonečna.
To je chyba zpracování EOF, ne pomalý proxy, který potřebuje delší časový limit. Při běžném příjmu přes streamový socket prázdný bajtový řetězec znamená, že protějšek se odpojil. Zbývajících pět bajtů tímto spojením nedorazí.
Pomocník pro přesné čtení potřebuje tři odlišné výsledky: shromažďovat neprázdné části, selhat na EOF před požadovanou délkou a předat časový limit nebo jinou chybu socketu. Tyto případy se nesmí slít do jedné obecné smyčky opakování.
Před operací nastavte zamýšlený časový limit socketu a čtěte délky polí určené protokolem proxy. Jediný příjem může vrátit jen část odpovědi. Naopak, požadavek na velký pevný buffer neznamená, že každá adresa SOCKS má takovou délku.
Neopravujte závislost vložením starého úryvku MSG_WAITALL do jejího zdrojového kódu a předpokladem, že pokrývá EOF, signály a chování platformy. Dejte přednost podporované opravě v udržované implementaci, nebo záměrně implementujte kontrakt pomocníka, když je parser váš kód.
Zaznamenejte, kolik bajtů bylo očekáváno a přijato, bez logování užitečných dat s přihlašovacími údaji. „EOF po třech z osmi bajtů odpovědi“ vysvětluje porušenou výměnu mnohem lépe než „proxy zase zamrzl“.