Afin de permettre à mes utilisateurs d’héberger des vidéos, des fichiers audio, etc. qu’ils intègrent dans les publications Discourse, j’ai configuré un serveur Apache fonctionnant parallèlement au Nginx qui exécute Discourse. Le serveur Apache fonctionne sur le port 8008 pour http: et sur le port 591 pour https: (ports IANA réservés pour http-alt). Cela fonctionne bien et le contenu du serveur est accessible depuis les navigateurs en spécifiant le numéro de port dans l’URL, par exemple :
https://scanalyst.fourmilab.ch:591/video/f9_from_drone_ship_2022-10-12.mp4
Mais si vous essayez d’intégrer cette URL dans une publication Discourse, cela échoue avec :
Désolé, nous n’avons pas pu générer un aperçu de cette page web, car le serveur ‘scanalyst.fourmilab.ch’ n’a pas pu être trouvé. Au lieu d’un aperçu, seul un lien apparaîtra dans votre publication.
Si j’exécute tcpdump et que je surveille le trafic DNS, je ne vois rien être envoyé lorsqu’il rejette cette URL. Il la rejette sans jamais effectuer de requête DNS. Si je change le numéro de port dans l’URL en 443, le défaut pour https:, il effectue la requête DNS normalement mais l’intégration échoue, bien sûr, car le serveur Apache n’écoute pas sur ce port et le serveur Discourse ne sait pas quoi faire de l’URL. Je n’ai rien vu dans la documentation Discourse qui indique que les URL d’intégration ne peuvent pas spécifier de numéro de port.
En parcourant le code source, j’ai trouvé un test dans la fonction validate_uri_format à la ligne 362 de lib/final_destination.rb qui se lit :
return false if @uri.scheme == 'https' && @uri.port != 443
ce qui semble rejeter une URL https: qui utilise un port autre que 443. Cela semblait expliquer ce que je voyais, j’ai donc commenté cette ligne, mais cela n’a fait aucune différence, même après avoir redémarré Discourse. Lorsque la publication apparaît sur le site avec l’intégration transformée en lien texte, cliquer sur le lien texte affiche correctement la vidéo, donc le seul problème est l’échec de la reconnaissance en tant qu’intégration et l’encadrement du lecteur en ligne.
Mes questions sont, à ce stade :
- Les numéros de port non standard sont-ils censés fonctionner sur les URL pour les intégrations dans les publications Discourse ?
- Si oui, qu’est-ce qui cause le rejet de ces URL ?
- Y a-t-il un moyen de les faire fonctionner ?
Il y a eu une discussion ici en mars 2017 sur ce problème dans ces deux publications :
- Specifying port for embeddable host given an IP results in error
- FIX: Allow ports for embed host IPs #4759 (sur GitHub)
qui impliquaient que le problème avait été résolu, mais cela ne fonctionne pas aujourd’hui sur 2.9.0.beta10.
Merci pour toute information et/ou assistance à ce sujet.