Para permitir que meus usuários hospedem vídeos, arquivos de áudio, etc. que eles incorporam em postagens do Discourse, configurei um servidor Apache rodando em paralelo ao Nginx que executa o Discourse. O servidor Apache roda na porta 8008 para http: e na porta 591 para https: (portas IANA reservadas para http-alt). Isso funciona bem e o conteúdo no servidor é acessível pelos navegadores especificando o número da porta na URL, por exemplo:
https://scanalyst.fourmilab.ch:591/video/f9_from_drone_ship_2022-10-12.mp4
Mas se você tentar incorporar essa URL em uma postagem do Discourse, ela falha com:
Desculpe, não foi possível gerar uma prévia desta página da web, pois o servidor ‘scanalyst.fourmilab.ch’ não pôde ser encontrado. Em vez de uma prévia, apenas um link aparecerá em sua postagem.
Se eu executar tcpdump e monitorar o tráfego DNS, não vejo nada sendo enviado quando ele rejeita essa URL. Ele a rejeita sem nunca fazer uma consulta DNS. Se eu alterar o número da porta na URL para 443, o padrão para https:, ele faz a consulta DNS normalmente, mas a incorporação falha, é claro, porque o servidor Apache não está escutando nessa porta e o servidor Discourse não sabe o que fazer com a URL. Não vi nada na documentação do Discourse que indique que URLs de incorporação não podem especificar um número de porta.
Analisando o código-fonte, encontrei um teste na função validate_uri_format na linha 362 de lib/final_destination.rb que diz:
return false if @uri.scheme == 'https' && @uri.port != 443
que parece rejeitar uma URL https: que usa uma porta diferente de 443. Isso pareceu explicar o que eu estava vendo, então comentei essa linha, mas não fez diferença alguma, mesmo depois de reiniciar o Discourse. Quando a postagem aparece no site com a incorporação transformada em um link de texto, clicar no link de texto mostra o vídeo corretamente, então o único problema é falhar em reconhecê-lo como uma incorporação e envolver o player inline em torno dele.
Minhas perguntas são, neste ponto:
- Números de porta não padrão têm permissão para funcionar em URLs para incorporações em postagens do Discourse?
- Se sim, o que está causando a rejeição dessas URLs?
- Existe alguma maneira de fazê-las funcionar?
Houve uma discussão aqui em março de 2017 sobre essa questão nestas duas postagens:
- Specifying port for embeddable host given an IP results in error
- FIX: Allow ports for embed host IPs #4759 (no GitHub)
que implicavam que o problema havia sido corrigido, mas não funciona hoje na versão 2.9.0.beta10.
Obrigado por quaisquer insights e/ou assistência neste assunto.