EOF in einer Python-SOCKS-Leseschleife behandeln
Behandle EOF in einer SOCKS-Leseschleife für exaktes Lesen explizit, statt eine geschlossene Verbindung als Timeout zu behandeln, der nie eintritt.
Eine Schleife möchte acht Bytes einer SOCKS-Antwort. Sie hat drei erhalten. Der nächste Lesevorgang liefert b'', die Schleife hängt ihn an, prüft die Länge und versucht es endlos erneut.
Das ist ein EOF-Behandlungsfehler und kein langsamer Proxy, der ein längeres Timeout braucht. Bei einem normalen Empfang über einen Stream-Socket bedeutet eine leere Bytefolge, dass die Gegenstelle die Verbindung getrennt hat. Die restlichen fünf Bytes werden über diese Verbindung nicht ankommen.
Ein Helper für exaktes Lesen braucht drei verschiedene Ergebnisse: nicht leere Teile ansammeln, bei EOF vor der erforderlichen Länge fehlschlagen und ein Timeout oder einen anderen Socketfehler weitergeben. Diese Fälle sollten nicht in einer einzigen generischen Wiederholungsschleife zusammenfallen.
Setze das beabsichtigte Timeout des Sockets vor der Operation und lies die vom Proxy-Protokoll vorgegebenen Feldlängen. Ein einzelner Empfang kann nur einen Teil einer Antwort zurückgeben. Umgekehrt bewirkt die Anforderung eines großen festen Puffers nicht, dass jede SOCKS-Adresse diese Länge hat.
Repariere eine Abhängigkeit nicht, indem du ein altes MSG_WAITALL-Snippet in ihren Quelltext einfügst und annimmst, es decke EOF, Signale und Plattformverhalten ab. Bevorzuge den unterstützten Fix der gepflegten Implementierung oder implementiere den Vertrag des Helpers bewusst, wenn der Parser dein Code ist.
Halte fest, wie viele Bytes erwartet und empfangen wurden, ohne Anmeldedaten-Nutzlasten zu protokollieren. „EOF nach drei von acht Antwortbytes“ erklärt den kaputten Austausch viel besser als „Proxy hängt wieder“.