Traduzir um pedido SOCKS5 num túnel HTTP
Conclua a troca CONNECT com o pai, devolva a resposta SOCKS ao cliente e só depois encaminhe os bytes da aplicação.
Uma interface SOCKS5 pode utilizar um proxy HTTP como o seu transporte seguinte. Atua como servidor SOCKS perante o cliente e como cliente HTTP CONNECT perante o pai. As duas trocas de controlo terminam antes de começar o fluxo da aplicação.
O pedido SOCKS CONNECT já fornece o anfitrião ou endereço de destino e a porta. Para uma troca HTTP/1.1 ilustrativa com o pai:
client → adapter: SOCKS5 CONNECT service.example.net:443
adapter → parent:
CONNECT service.example.net:443 HTTP/1.1
Host: service.example.net:443
parent → adapter: HTTP/1.1 200 Connection Established
[end of headers]
adapter → client: SOCKS5 success reply
client ↔ adapter ↔ parent ↔ service: application bytes
Traduza o resultado na fronteira
O adaptador completa qualquer autenticação exigida pelo pai e aguarda o resultado do CONNECT. Uma resposta 2xx bem-sucedida estabelece o túnel do pai. Só então deve devolver a resposta SOCKS de sucesso correspondente ao cliente a jusante.
Se o pai rejeitar a operação, envie uma resposta SOCKS de falha definida e, em seguida, termine de imediato a ligação do cliente. O SOCKS5 exige esse fecho nos dez segundos seguintes à deteção da falha. Guarde o estado HTTP do pai como informação de diagnóstico para o adaptador. Encaminhar essa linha de estado como dados da aplicação colocaria uma mensagem de controlo HTTP num fluxo cujo cliente espera um enquadramento SOCKS.
Antes de um resultado CONNECT bem-sucedido, o pai ainda fala HTTP, incluindo o enquadramento de qualquer resposta de desafio ou erro. Após o delimitador de cabeçalhos de um resultado bem-sucedido, a ligação passa a ser o túnel; não há qualquer corpo de resposta HTTP a consumir primeiro.
Preserve os bytes após os cabeçalhos
Uma leitura pode conter ao mesmo tempo o fim dos cabeçalhos do pai e bytes vindos do destino. Retenha esses bytes adicionais para a aplicação a jusante. Os protocolos em que o servidor fala primeiro podem saudar logo após a abertura da ligação.
Depois de enviada a resposta SOCKS de sucesso, encaminhe o fluxo da aplicação nos dois sentidos. O adaptador não precisa de alternar uma mensagem de cliente com uma mensagem de servidor, nem de compreender os registos TLS para os encaminhar. O seu trabalho de protocolo foi estabelecer e traduzir as duas negociações de túnel.