Tenho lutado com um problema há algum tempo que ainda não parece ter sido relatado. Peço desculpas pela quantidade estranha de partes envolvidas, mas tentarei descrevê-lo de forma sucinta.
O resumo é o seguinte: quando coloco um link em uma mensagem, o Ruby Gem que finalmente faz a requisição HTTP GET para aquela URL para buscar dados de incorporação envia uma requisição HTTP que, segundo alguns proxies HTTP, é considerada inválida conforme a especificação. Isso impede que as pré-visualizações funcionem em alguns casos:
A versão um pouco mais longa é esta: usamos um ótimo serviço chamado Gitbook.io para nossa documentação. O Gitbook é uma solução hospedada e eles utilizam Cloudflare workers para redirecionamentos internos em seu site. Parte desses Cloudflare workers envolve o uso da API Node Fetch para fazer proxy de requisições HTTP. Os desenvolvedores do Node Fetch são EXTREMAMENTE rigorosos em seguir a especificação e rejeitam qualquer requisição GET que tenha um corpo HTTP ou até mesmo um cabeçalho Content-Length, mesmo que esse cabeçalho esteja definido como 0.
E é exatamente isso que está acontecendo. O Ruby Gem que faz a requisição HTTP envia um cabeçalho de requisição:
Content-Length: 0
Isso irrita profundamente o proxy do Node Fetch e resulta na rejeição da requisição pelo servidor remoto. Houve muitos debates em diferentes fóruns sobre se um corpo de requisição em um GET ou apenas um cabeçalho de content-length é válido conforme a especificação HTTP. Eu não tenho problema com isso, mas isso não impediu os desenvolvedores do Node Fetch de fechar todas as issues já abertas pedindo que permitissem tal semântica.
Infelizmente, estou preso no meio disso tudo:
- O projeto Node Fetch se recusa a considerar essas requisições HTTP como válidas.
- O suporte da Cloudflare se recusa a me ajudar porque não tenho controle sobre os workers baseados em Node em questão.
- O suporte do Gitbook se recusa a me ajudar porque concordam com os desenvolvedores do Fetch (e não tenho certeza se realmente se importam).
- E a biblioteca HTTPrb se recusa a remover o cabeçalho porque consideram que é perfeitamente válido.
Portanto, sobra-me postar aqui perguntando se há alguma maneira de controlar ou alterar as requisições HTTP GET feitas para pré-visualizações de links, de modo a incluir um conjunto aceitável de cabeçalhos HTTP, de forma que proxies que utilizam bibliotecas extremamente rigorosas, como o Node Fetch, não rejeitem essas requisições?
Se quiserem tentar, aqui está uma URL de exemplo hospedada nos servidores do Gitbook que utiliza o Cloudflare worker alimentado pelo Node Fetch:



