Håndter EOF i en Python SOCKS-læseløkke
Håndter EOF eksplicit i en SOCKS-læseløkke med præcis læsning i stedet for at behandle en lukket forbindelse som en timeout, der aldrig kommer.
En løkke vil have otte byte af et SOCKS-svar. Den har modtaget tre. Den næste læsning returnerer b'', og løkken tilføjer det, kontrollerer længden og prøver igen for evigt.
Det er en EOF-håndteringsfejl, ikke en langsom proxy, der har brug for en længere timeout. Ved en normal stream-socket-modtagelse betyder en tom bytestreng, at modparten er koblet fra. De resterende fem byte kommer ikke på den forbindelse.
En hjælpefunktion til præcis læsning har brug for tre forskellige udfald: akkumulere ikke-tomme bidder, fejle på EOF før den krævede længde og videresende en timeout eller en anden socketfejl. De tilfælde bør ikke smelte sammen i én generisk genforsøgsløkke.
Indstil socketens tilsigtede timeout før operationen, og læs de feltlængder, som proxyprotokollen angiver. En enkelt modtagelse kan kun returnere en del af et svar. Omvendt gør en anmodning om en stor fast buffer ikke, at hver SOCKS-adresse har den længde.
Reparer ikke en afhængighed ved at indsætte et gammelt MSG_WAITALL-uddrag i dens kildekode og antage, at det dækker EOF, signaler og platformadfærd. Foretræk den vedligeholdte implementerings understøttede rettelse, eller implementer hjælperens kontrakt bevidst, når parseren er din kode.
Behold, hvor mange byte der var forventet og modtaget, uden at logge legitimationsnyttelaster. “EOF efter tre af otte svarbyte” forklarer den ødelagte udveksling meget bedre end “proxyen hænger igen”.