Um ciclo quer oito bytes de uma resposta SOCKS. Já recebeu três. A leitura seguinte devolve b'', e o ciclo acrescenta-o, verifica o comprimento e tenta novamente para sempre.

Isso é um erro de tratamento do EOF, não um proxy lento que precisa de um tempo limite maior. Numa receção normal através de um socket de fluxo, uma cadeia de bytes vazia significa que o par se desligou. Os cinco bytes restantes não chegarão por essa ligação.

Um auxiliar de leitura exata precisa de três resultados distintos: acumular fragmentos não vazios, falhar no EOF antes do comprimento exigido e propagar um tempo limite ou outro erro de socket. Esses casos não devem colapsar num único ciclo de tentativas genérico.

Defina o tempo limite pretendido do socket antes da operação e leia os comprimentos de campo especificados pelo protocolo do proxy. Uma única receção pode devolver apenas parte de uma resposta. Inversamente, pedir um grande buffer fixo não faz com que todos os endereços SOCKS tenham esse comprimento.

Não repare uma dependência colando um fragmento antigo de MSG_WAITALL no seu código-fonte e assumindo que cobre EOF, sinais e comportamento da plataforma. Prefira a correção suportada da implementação mantida, ou implemente deliberadamente o contrato do auxiliar quando o analisador for o seu código.

Guarde quantos bytes eram esperados e foram recebidos, sem registar cargas úteis de credenciais. «EOF após três dos oito bytes de resposta» explica a troca quebrada muito melhor do que «o proxy voltou a bloquear».

Artigos relacionados