Pourquoi reconstruire un petit client de protocole.
Le dépôt était un prototype visuel Flutter, mais la vraie question était plus basse couche : parser fidèlement un menu Gopher, expliquer chaque champ et ouvrir une ressource réelle sans réseau non borné.
Un navigateur ne peut pas établir la connexion TCP brute de Gopher. Le projet assume cette limite avec un parser dans deux contextes : TCP réel dans la CLI et fixture déterministe dans l’explorateur.
Les limites du protocole.
Même un petit client exige des règles réseau et de rendu explicites :
- Les requêtes ont délai absolu, timeout d’inactivité, plafond de 8 KiB et réponse bornée.
- Les octets binaires restent binaires et ne sont jamais imprimés dans un terminal interactif.
- Les séquences de contrôle sont neutralisées avant l’affichage de texte non fiable.
- Les lignes de menu mal formées restent visibles afin de ne pas transformer une erreur en donnée plausible.
Un parser, deux transports.
Le parser et les règles URL sont utiles sans connexion. Dans le site statique, ils rendent le protocole compréhensible et testable sans proxy qui modifierait le modèle de sécurité.
La CLI ajoute le transport manquant : TCP borné, connexion directe non chiffrée et traitement explicite des menus, textes, recherches et binaires.
Le chemin de la requête.
Une URL gopher:// devient hôte, port et selector. La CLI envoie le selector sur TCP borné puis confie les octets au traitement partagé. Le navigateur commence à la même frontière avec une fixture versionnée.
Les choix qui gardent le client lisible.
Le comportement visible du protocole prime sur la magie pratique.
Préserver les selectors
Les URL de recherche RFC 4266 sont analysées sans réduire les segments point du selector distant.
Les selectors Gopher ne suivent pas les habitudes HTTP ; la différence doit rester explicite.
Échouer sans risque dans le terminal
Le texte est nettoyé des séquences de contrôle et les ressources binaires doivent être redirigées vers un fichier.
Le client refuse des sorties pratiques pour protéger l’intégrité du terminal.
Garder la démo déterministe
GitHub Pages utilise une fixture incluse et ne prétend jamais joindre un serveur Gopher réel.
L’explorateur enseigne ; ce n’est pas un client réseau web.
Intégrité des publications.
Les candidats sont construits deux fois ; archives npm et preuves SBOM normalisées doivent être identiques octet pour octet. Un smoke test exécute la commande publiée dans un préfixe propre.
La publication taguée valide version, ascendance depuis main révisé, checksums, attestations et inventaire immuable. Gopher+, TLS, Telnet, authentification et téléchargements automatiques restent hors périmètre.
Ce que l’on peut inspecter.
Le terminal ouvre menus, textes et recherches Gopher réels sur un transport borné. Le navigateur parcourt une fixture au clavier et expose type, selector, hôte et port.
Le projet est volontairement étroit, ce qui rend sa frontière réseau, son parser et ses fonctions absentes faciles à comprendre.
Registre des preuves.
Les affirmations sur le protocole et le transport reposent sur des limites explicites :
- Vérification
- 68 déclarations de tests Node.js et deux E2E web dans la version auditée.
- Limites de requête
- Plafond de 8 KiB, délai total de 5 secondes, inactivité de 2.5 secondes et limite par défaut de 10 000 entrées de menu.
- Limites de réponse
- Plafond par défaut de 1 MiB et plafond absolu configurable de 10 MiB.
- Limite
- Le TCP direct n’est pas chiffré ; TLS, authentification, Gopher+, Telnet et téléchargements automatiques ne sont pas pris en charge.