O Asio precisa de uma troca SOCKS5 depois de ligar ao proxy
Trate o SOCKS5 como uma máquina de estados de protocolo sobre o socket do Asio, com leituras completas, respostas validadas e TLS do destino só depois de CONNECT ter êxito.
Ligar um socket TCP do Asio a um ouvinte SOCKS5 conclui um passo: a ligação TCP a esse ouvinte. Não pede ao proxy que se ligue ao servidor final. Para um teste permitido contra um alvo público, a lista de proxies SOCKS5 oferece candidatos para esse primeiro ponto final TCP; o conector ainda tem de concluir a troca abaixo.
Um conector SOCKS5 tem então de executar a troca do protocolo:
- Enviar uma saudação de versão 5 que enumere os métodos de autenticação suportados pelo cliente.
- Ler o método selecionado e realizar a sua troca de autenticação quando necessário.
- Enviar CONNECT com o tipo de endereço do destino, o endereço e a porta na ordem de bytes de rede.
- Ler a resposta, verificar a versão e o código de resultado, e consumir o endereço associado e a porta completos de comprimento variável.
- Entregar o fluxo estabelecido ao protocolo da aplicação.
Um auxiliar chamado socks5::async_proxy_connect pertence à implementação de SOCKS que fornece esse auxiliar. Nomeá-lo ao lado de boost::asio não o torna parte da interface de socket TCP do Asio.
As leituras TCP podem devolver apenas parte de uma resposta. Componha leituras para as contagens de bytes necessárias e depois escolha o comprimento restante no campo de tipo de endereço. Não assuma que toda resposta do servidor tem o formato IPv4 fixo.
Para HTTPS, realize o aperto de mão TLS do destino depois de SOCKS CONNECT ter êxito, preservando o SNI e a verificação do nome do anfitrião do destino. Uma resposta de proxy bem-sucedida sozinha não autentica o site.
Mantenha o cancelamento e os prazos durante toda a sequência de configuração. Se o tempo de estabelecimento da ligação TCP terminar, as trocas posteriores de saudação, autenticação e CONNECT ficam sem limite.