Manejar EOF en un bucle de lectura SOCKS de Python
Maneja EOF explícitamente en un bucle de lectura exacta SOCKS en lugar de tratar una conexión cerrada como un tiempo de espera que nunca llega.
Un bucle quiere ocho bytes de una respuesta SOCKS. Ha recibido tres. La siguiente lectura devuelve b'', y el bucle lo añade, comprueba la longitud y vuelve a intentarlo para siempre.
Eso es un error de manejo de EOF, no un proxy lento que necesita un tiempo de espera más largo. En una recepción normal por un socket de flujo, una cadena de bytes vacía significa que el par se ha desconectado. Los cinco bytes restantes no llegarán por esa conexión.
Un auxiliar de lectura exacta necesita tres resultados distintos: acumular fragmentos no vacíos, fallar en EOF antes de la longitud requerida y propagar un tiempo de espera u otro error de socket. Esos casos no deberían colapsar en un único bucle de reintentos genérico.
Establece el tiempo de espera previsto del socket antes de la operación y lee las longitudes de campo que especifica el protocolo del proxy. Una sola recepción puede devolver solo parte de una respuesta. A la inversa, pedir un búfer fijo grande no hace que todas las direcciones SOCKS tengan esa longitud.
No repares una dependencia pegando un fragmento antiguo de MSG_WAITALL en su código fuente y suponiendo que cubre EOF, señales y comportamiento de la plataforma. Prefiere la corrección admitida de la implementación mantenida, o implementa deliberadamente el contrato del auxiliar cuando el analizador sea tu código.
Conserva cuántos bytes se esperaban y se recibieron, sin registrar cargas útiles de credenciales. «EOF tras tres de ocho bytes de respuesta» explica el intercambio roto mucho mejor que «el proxy se ha colgado otra vez».