3 points par GN⁺ 2024-01-30 | 1 commentaires | Partager sur WhatsApp

Utiliser --libcurl

  • Utilisation recommandée de libcurl : il est recommandé aux utilisateurs d’essayer d’abord le transfert souhaité avec l’outil en ligne de commande curl, puis, une fois qu’il fonctionne à peu près comme voulu, de relancer la commande en ajoutant l’option --libcurl [nom_du_fichier].
  • Génération de code : l’option de ligne de commande --libcurl génère un programme C avec le nom de fichier fourni. Ce programme C utilise libcurl pour exécuter le transfert effectué par l’outil en ligne de commande curl.
  • Exceptions et différences : le résultat ne correspond pas toujours à 100 %, mais cela peut fournir une excellente source d’inspiration concernant les options libcurl et les arguments supplémentaires à utiliser.

Exemple de code

  • Exemple d’exécution : si vous exécutez la commande curl http://example.com --libcurl example.c, le fichier example.c est créé dans le répertoire courant.
  • Code généré : le code généré inclut divers réglages d’options via curl_easy_setopt(), et certaines options ne peuvent pas être générées facilement depuis la source ; l’utilisateur peut donc devoir les implémenter lui-même ou choisir de ne pas les utiliser.

Avis de GN⁺

  • Utilité de libcurl : cette fonctionnalité permet aux développeurs de convertir facilement en programme C une commande curl fonctionnelle en ligne de commande, ce qui accélère le développement d’applications utilisant libcurl.
  • Avantage de la génération de code : le code généré automatiquement peut aider les développeurs à comprendre et appliquer plus rapidement l’API de libcurl.
  • Valeur comme outil d’apprentissage : cela peut constituer un bon support d’apprentissage pour les ingénieurs logiciel débutants, en montrant des exemples concrets d’utilisation des options de libcurl et de programmation réseau.

1 commentaires

 
GN⁺ 2024-01-30
Commentaires Hacker News
  • Le schéma qui consiste à trouver la requête voulue dans l’onglet Réseau des outils de développement du navigateur, à la copier via « copy as curl », puis à la convertir avec un outil comme https://curlconverter.com/ en code de requête pour le langage qu’on utilise est vraiment excellent.
    D’une certaine manière, curl sert de représentation intermédiaire traduisible vers à peu près n’importe quoi.

    • Les utilisateurs de R peuvent convertir une commande « copy as curl » en code de requête avec la fonction curl_translate du package httr2, une réécriture récente de httr.
      https://httr2.r-lib.org/reference/curl_translate.html
    • curlconverter.com a l’air suffisamment bien pour être ajouté directement aux favoris.
      Le « copy as curl » du navigateur récupère l’authentification et les en-têtes d’encodage dans un état qui fonctionne à coup sûr, ce qui est bien plus pratique que de bricoler soi-même une commande curl sur plusieurs lignes.
    • Dépanner des endpoints d’API est devenu beaucoup plus simple.
      On peut modifier les paramètres de requête pour l’envoyer à une instance locale, ou la passer à jq via un pipe afin de mettre en forme la sortie.
    • Quand un endpoint ne fonctionne pas, constater que la première étape devient « est-ce que ça marche avec curl ? » est vraiment juste.
    • HTTP lui-même n’a pas besoin de représentation intermédiaire, mais l’universalité de cURL fait qu’il joue de fait ce rôle.
      Comme il est extrêmement répandu, des outils exportent les requêtes en cURL, et d’autres importent du cURL.
  • C’est assez génial qu’une interface en ligne de commande dispose d’un flag qui crache le code source d’un programme faisant la même chose que la commande courante.
    On a l’impression d’ouvrir le capot pour voir ce qui se passe à l’intérieur ; non seulement cela aide à mieux comprendre le fonctionnement, mais cela facilite aussi l’adaptation ou l’extension selon ses besoins.

    • C’est aussi une excellente documentation pour la bibliothèque de programmation.
      Si, en utilisant libcurl, on se rend compte qu’on a besoin de quelque chose comme des requêtes par plage, ou si l’on a fait « copy as curl » dans l’onglet Réseau du navigateur, il suffit d’exécuter la commande puis d’ajouter --libcurl pour voir exactement comment faire avec la bibliothèque C.
    • Ce serait bien que cette approche s’applique aussi aux paramètres Gnome, aux paramètres réseau, aux interfaces GUI de configuration de pare-feu, et à tout ce qui peut fonctionner via des commandes CLI.
  • Cette approche a été l’une des raisons du succès des macros Visual Basic de Microsoft Office.
    On pouvait effectuer une action dans Word ou Excel, regarder la macro générée, puis modifier le code selon ses besoins. C’est un concept simple mais puissant, et c’est agréable de le voir aussi dans curl.

    • Microsoft a également créé un outil utile dans le même esprit : il permet d’examiner la structure d’un document Office donné et de voir le code C# qui génère ses composants.
      Il ne semble pas avoir été mis à jour depuis longtemps : https://github.com/dotnet/Open-XML-SDK/releases/tag/v2.5
    • Il doit bien exister un schéma généralisé pour ce genre de choses.
      AREXX sur Amiga me vient aussi à l’esprit.
    • Cela rappelle aussi le parallèle XAML/UI côté Excel qu’on voyait dans l’éditeur WPF de Visual Studio.
  • Pour compiler, il faut indiquer à gcc de faire le lien avec libcurl, par exemple en ajoutant -lcurl.
    Par exemple, on crée l’adresse IP et ip_fetcher.c avec curl https://ifconfig.me --libcurl ip_fetcher.c, puis on compile avec gcc -o ip_fetcher ip_fetcher.c -lcurl, et en exécutant ./ip_fetcher, l’adresse IP s’affiche.
    Pour quelqu’un qui n’écrit pas du C tous les jours, cette étape de linkage de base est aussi une information utile.

    • Si l’on préfère utiliser make plutôt que de taper directement une commande cc, il existe une méthode encore plus simple.
      Après curl https://ifconfig.me --libcurl ip_fetcher.c, il suffit de lancer make LDFLAGS=-lcurl ip_fetcher, puis ./ip_fetcher.
  • Pour faire un peu de promotion, Hurl est une CLI open source qui utilise libcurl pour exécuter et tester des requêtes HTTP en texte brut.
    Elle s’appuie sur la grande fiabilité de libcurl et sur des fonctionnalités comme HTTP/3, tout en ajoutant l’enchaînement des requêtes, la capture de données dans les réponses pour les transmettre à la requête suivante, ainsi que des tests de réponses avec JSONPath ou XPath.
    Il y a aussi du sucre syntaxique pour les requêtes d’API REST/SOAP/GraphQL, mais le cœur reste simplement libcurl ; avec l’option verbose, on peut aussi grepper la commande curl. J’y participe comme mainteneur.
    https://hurl.dev

  • Ce serait bien que ce genre de fonctionnalité soit aussi possible avec ffmpeg.

  • Daniel Stenberg apporte vraiment un soin minutieux aux détails ainsi qu’à l’expérience développeur et utilisateur.
    Un tel niveau de finition est impressionnant.

  • Il me semble que Daniel Stenberg lui-même avait mentionné cette option dans une vidéo de 3 heures où il passe en revue la plupart des options de ligne de commande de curl.
    https://www.youtube.com/watch?v=V5vZWHP-RqU

  • Le titre soumis devrait contenir deux traits d’union (--), et non une combinaison tiret cadratin pleine chasse + trait d’union (—-).

    • En envoyant un e-mail aux administrateurs via le lien Contact dans le pied de page, ils pourront le voir et le corriger.
  • Est-ce que cette option signifie qu’elle génère un programme C compilable capable de remplacer un script qui enveloppe l’appel curl d’origine ?

    • Oui. C’était déjà possible avec libcurl, mais jusqu’ici il fallait écrire soi-même le code boilerplate.
    • L’idée est qu’on peut copier-coller le code C généré dans un programme existant, ou au minimum l’utiliser comme référence pour voir quels appels à l’API libcurl sont nécessaires afin de reproduire cet appel curl.
    • Pour que ce soit utile sur des pages web classiques, etc., il faudra probablement modifier quelques paramètres.
      Il vaut mieux le voir comme un point de départ qui évite de passer des heures à fouiller la documentation.