WebSocket e gRPC através de proxy: upgrade de protocolo, CONNECT e depuração de conexões longas
História conhecida? Requisições REST através de um proxy corporativo ou em nuvem voam sem problemas, mas basta abrir um WebSocket ou chamar um método gRPC que a conexão ou não estabelece, ou vive por trinta segundos e morre silenciosamente. E no navegador ou nos logs da aplicação você vê misteriosos 101, 502, 504 ou simplesmente um connection reset inesperado. Isso não é misticismo nem carma. É a diferença fundamental entre como um proxy lida com transações curtas de requisição-resposta e como ele deve se comportar com fluxos bidirecionais de longa duração.
Este artigo é um guia completo sobre como protocolos que vivem sobre TCP passam por proxies: WebSocket, gRPC e, basicamente, tudo que exige upgrade de protocolo ou um túnel ponta a ponta. Vamos dissecar a mecânica até o último cabeçalho, mostrar a diferença entre ws:// via proxy HTTP e wss:// via método CONNECT, explicar por que o SOCKS5 muitas vezes é mais simples, o que fazer com gRPC sobre HTTP/2, como vencer os timeouts de inatividade e, principalmente, como depurar tudo isso quando nada funciona. No final, código funcional em Python e Node, checklists e FAQ.
Já adianto o escopo do assunto: a mecânica do UDP ASSOCIATE no SOCKS5 não vamos abordar aqui de propósito — é uma conversa grande e separada sobre datagramas, e há um material dedicado a ela. Aqui focamos exclusivamente em protocolos TCP sobre HTTP e SOCKS.