Rukovanje EOF-om u Python SOCKS petlji čitanja
Eksplicitno rukujte EOF-om u SOCKS petlji točnog čitanja umjesto da zatvorenu vezu tretirate kao vremensko ograničenje koje nikad ne dolazi.
Petlja želi osam bajtova SOCKS odgovora. Primila je tri. Sljedeće čitanje vraća b'', petlja ga dodaje, provjerava duljinu i ponovno pokušava zauvijek.
To je pogreška u rukovanju EOF-om, a ne spor proxy kojem treba dulje vremensko ograničenje. Kod normalnog primanja preko stream socketa, prazan niz bajtova znači da se druga strana odspojila. Preostalih pet bajtova neće stići tom vezom.
Pomoćnik za točno čitanje treba tri različita ishoda: akumulirati neprazne dijelove, pasti na EOF prije potrebne duljine i proslijediti vremensko ograničenje ili drugu pogrešku socketa. Ti se slučajevi ne smiju stopiti u jednu generičku petlju ponovnih pokušaja.
Postavite predviđeno vremensko ograničenje socketa prije operacije i čitajte duljine polja koje propisuje proxy protokol. Jedno primanje može vratiti samo dio odgovora. Suprotno tome, zahtjev za velikim fiksnim međuspremnikom ne čini svaku SOCKS adresu te duljine.
Ne popravljajte ovisnost lijepljenjem starog MSG_WAITALL isječka u njezin izvorni kod i pretpostavkom da pokriva EOF, signale i ponašanje platforme. Preferirajte podržani popravak u održavanoj implementaciji ili namjerno implementirajte ugovor pomoćnika kada je parser vaš kod.
Zadržite koliko je bajtova očekivano i primljeno, bez bilježenja korisnih opterećenja vjerodajnica. „EOF nakon tri od osam bajtova odgovora“ objašnjava pokvarenu razmjenu mnogo bolje od „proxy se ponovno zamrznuo“.