Un framework C pour le web moderne
Alors que la plupart des développeurs associent le développement de services web à des langages comme Node.js, Go, Python ou Rust, le langage C reste souvent oublié. Pourtant, le développeur Brian Downs a présenté libpapago, un framework web conçu pour offrir à la fois les performances brutes du C et l'ergonomie des frameworks modernes. Accompagné de son moteur de templates libmaple, l'ensemble constitue une solution complète pour le développement web côté serveur en pur C.
Pourquoi un framework web en C ?
Selon l'auteur, C n'est pas le premier langage auquel on pense pour bâtir un service web, mais plusieurs scénarios justifient son usage : les systèmes embarqués, les API à latence critique, les bases de code existantes, ou encore les situations où l'on recherche le binaire le plus petit possible avec le moins de dépendances d'exécution. libpapago a été conçu avec ces contraintes à l'esprit : un framework complet et puissant, mais extrêmement simple à utiliser.
Caractéristiques techniques
Le framework libpapago est publié sous licence BSD 2-Clause et son code source est disponible sur GitHub à l'adresse github.com/briandowns/libpapago. Ses dépendances sont ciblées : libmicrohttpd pour le serveur HTTP intégré, libwebsockets pour le support WebSocket, et openssl pour le chiffrement TLS/SSL. Le moteur de templates libmaple est optionnel et activable à la compilation.
Un démarrage rapide
La construction de libpapago est présentée comme simple. L'utilisateur peut compiler le framework avec ou sans le support de templates HTML via Maple, et peut également activer la compilation d'une bibliothèque client WebSocket.
Hello World en moins de 30 lignes
Un exemple de serveur HTTP répondant à une requête GET sur "/hello" avec une charge JSON est fourni. Le code, qui tient en moins de 30 lignes, illustre la simplicité de l'API : création du serveur, configuration du port, enregistrement d'une route et démarrage. La compilation se fait avec les bibliothèques nécessaires, et le test via curl renvoie le message JSON attendu.
Routage RESTful complet
libpapago supporte les verbes HTTP standard : GET, POST, PUT, DELETE et PATCH. Les routes sont enregistrées avec une signature de fonction cohérente. Chaque gestionnaire reçoit trois arguments : un pointeur vers la requête, un pointeur vers la réponse, et un pointeur optionnel void *user_data permettant de passer un contexte applicatif (comme un handle de base de données) sans recourir à des variables globales.
Paramètres dynamiques et wildcards
Les routes peuvent inclure des paramètres nommés préfixés par ":", accessibles dans les gestionnaires via la fonction papago_req_param(). Par exemple, une route "/users/:id" permet d'extraire dynamiquement l'identifiant depuis l'URL. Le framework offre également la prise en charge des wildcards pour un filtrage plus large, utile pour le versionnage d'API ou les routes génériques.
Paramètres de requête
Les chaînes de requête URL sont automatiquement analysées. Les valeurs sont récupérables via la fonction papago_req_query(), permettant de traiter facilement des paramètres comme "q" pour une recherche ou "page" pour la pagination.
Implications pour le développement
Cette initiative pourrait intéresser les développeurs travaillant sur des systèmes où la mémoire et la puissance de calcul sont limitées, ou ceux qui cherchent à maximiser les performances tout en conservant une base de code en C. La présence de WebSocket et du support TLS/SSL en fait une solution potentiellement adaptée à des applications temps réel ou sécurisées.