2018, curl a vingt ans

Posté par (page perso) . Édité par ZeroHeure, Davy Defaud, palm123 et Bruno Michel. Modéré par ZeroHeure. Licence CC by-sa.
Tags :
73
29
mar.
2018
Internet

Curl est l’exemple du logiciel utilisé partout, tellement omniprésent que l’on oublie d’en parler. Aucune dépêche ou journal LinuxFr.org dédié à ce logiciel, alors même qu’un de ses homonymes le langage Curl a eu le droit d’être mentionné en 2001. Tandis que le vénérable curl fête ses vingt ans, il est temps de réparer cet honteux oubli.

Curl (curl ou plutôt cURL pour « client URL request library ») se rapporte en fait à la bibliothèque libcurl et à l’outil en ligne de commande curl, permettant de faire des requêtes sur un réseau (pléthore de protocoles sont pris en charge). Écrits en C, ils existent sur une multitude de systèmes différents et la bibliothèque est utilisable depuis de nombreux (plus de 40) langages (C++, Java, .NET, Perl, PHP, Ruby, etc.).

Sommaire

Documentation et fonctionnalités

La documentation mentionne notamment :

  • les systèmes AIX, AmigaOS, Android, BeOS, BlackBerry Tablet OS, BlackBerry 10, OpenVMS, Darwin, DOS, FreeBSD, GNU/Linux, HP-UX, HURD, iOS, IRIX, macOS, NetBSD, NetWare, OpenBSD, OS/2, QNX Neutrino, RISC OS, Solaris, Symbian, Tru64, Ultrix, UnixWare, Windows (oui, même Windows) et d’autres ;
  • les protocoles DICT, FILE, FTP, FTPS, Gopher, HTTP dont HTTP/2, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, Telnet et TFTP ;
  • une utilisation dans les voitures, les télévisions, les routeurs, les imprimantes, les équipements audio, les téléphones mobiles, les tablettes, les lecteurs multimédia, etc. (et probablement des machines à café) ; voir aussi la page des utilisations commerciales de curl ;
  • la bibliothèque est thread‐safe, compatible IPv6, prend en charge de multiples bibliothèques cryptographiques (axTLS, GnuTLS, mbed TLS, NSS, QSOSSL sur IBM i, SChannel sur Windows, Secure Transport sur macOS et iOS, SSL/TLS via OpenSSL, wolfSSL), etc. Voir l’entrée de blog sur la gestion de TLS 1.3.

Histoire

Le développeur principal est Daniel Stenberg (employé par Mozilla, grand, suédois, grognon, comme il se décrit sur son blog).

En 1997, HttpGet 1.0 est publié le 8 avril 1997. Mais, rapidement, le HTTP n’est pas suffisant, la prise en charge de GOPHER est ajoutée, et urlget 2.0 est publié (après renommage, donc). Le get c’est bien, mais le logiciel fait plus, alors curl 4.0 est publié le 20 mars 1998, sous licence GPL (voir la page histoire du projet).
Logo cURL de 1998   Logo cURL de 1998, par Henrik Hellerstedt

  • octobre 1998 : curl 4.9 (passage en licence MPL, 4 000 lignes de code) ;
  • 1999 : curl 6.0 (15 000 lignes) ;
  • 2000 : libcurl apparaît (2 000 lignes) ;
  • 2001 : curl 7.5.2 (passage en licence MIT, 24 000 lignes) ;
  • 2002 : 35 000 lignes ;
  • 2003 : 45 000 lignes ;
  • 2005 : GnuTLS comme alternative possible à OpenSSL ;
  • etc. ;
  • 2017 : les chiffres du projet sont éloquents :
    • versions publiées de curl : 169,
    • options en ligne de commande : 211,
    • options curl_easy_setopt() : 249,
    • fonctions publiques dans libcurl : 74,
    • contributeurs : 1609 ;
  • 14 mars 2018 : dernière version publiée à ce jour, curl 7.59.0.

Facteurs de croissance sur les 20 ans du projet :

  • protocoles pris en charge : x7.67 ;
  • options en ligne de commande : x9 ;
  • lignes de code : x75 ;
  • contributeurs: x100 ;
  • visiteurs hebdo sur le site Web : x1.400 ;
  • utilisateurs finaux du code : x4.000.000 ;
  • autocollants avec le logo curl : infinité.

Logo

Sécurité

Comme déjà dit précédemment, de multiples bibliothèques cryptographiques sont prises en charge (et comparées). Mais c’est l’autre aspect de la sécurité (les failles et problèmes) que cette partie veut aborder. Un outil ayant autant de fonctionnalités que curl/libcurl connaît forcément des failles au cours de son existence. L’historique du projet le rappelle et une page dédiée recense d’ailleurs les 78 failles précédemment découvertes (ainsi que les procédures en place).

Le récent exemple de transparence dont a fait preuve D. Stenberg est à la fois à saluer, et à la fois un indicateur de l’importance du sujet pour le projet, ce qui est plutôt rassurant.

Exemples d’utilisation

On trouve très facilement et très souvent des exemples d’utilisation de curl et des tutoriels d’utilisation. En voici quelques‐uns :

Un accès basique à LinuxFr.org

Un exemple bateau/trivial d’accès à un site Web : TCP, puis TLS, puis HTTP, et hop une page Web :

$ curl -v -s https://linuxfr.org
(...)
* Connected to linuxfr.org (88.191.250.176) port 443 (#0)
(...)
* SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256
(...)
*  SSL certificate verify ok.
(...)

> GET / HTTP/1.1^M
> Host: linuxfr.org^M
> User-Agent: curl/7.58.0^M
> Accept: */*^M
> ^M
(...)
< HTTP/1.1 200 OK^M
< Server: nginx/1.2.1^M
< Date: Thu, 29 Mar 2018 09:23:22 GMT^M
< Content-Type: text/html; charset=utf-8^M
(...)

Curlception

curl https://curl.haxx.se/download/curl-7.59.0.tar.xz|tar xvJf - && cd curl-7.59.0 && ./configure && make && make check

Ceci qui a permis de remonter un bogue sur les locales dû au séparateur décimal qui était une virgule au lieu du point attendu dans la barre de progression pour le résultat final de 100,00 %.

Documentation d’Elastic (Elasticsearch, Logstash, Kibana, etc.)

Prenons cet extrait de la documentation du logiciel Elasticsearch expliquant comment modifier un document :
Extrait de la documentation Elasticsearch

La requête est affichée pour les développeurs et peut‐être copiée‐collée en tant que commande curl (curl -XPUT 'localhost:9200/twitter/_doc/1?pretty' -H 'Content-Type: application/json' -d'{"user" : "kimchy", "post_date" : "2009-11-15T14:12:12", "message" : "trying out Elasticsearch"}')

Blog de Stéphane Bortzmeyer

Des exemples variés d’utilisation, en français :

Installation de RVM

La procédure d’installation de RVM (Ruby Version Manager) utilise explicitement curl (reprise d’ailleurs dans la documentation d’installation du code de LinuxFr.org) :

\curl -sSL https://get.rvm.io | bash

Parrot.live

Cette commande permet d’amener la paix dans le monde et de sauver les oisillons dodo :

curl parrot.live

En vrac

  • attention aux mauvaises pratiques du type curl --insecure https://domainelouche.example.invalid/p0wn/service.csh|sudo tcsh ;
  • d’autres outils en ligne de commande dans la même catégorie : httpie, bat, wget, et le projet curl maintient un tableau comparatif évoquant aussi snarf, pavuk, fget, lftp, aria2, httrack. Une autre page décrit aussi les alternatives à libcurl ;
  • malgré deux changements de noms, le projet a divers homonymes, aussi bien comme noms propres (dont un prix Nobel et une marque de fringues et de sport) que comme mots courants en anglais (boucle/boucler), ce qui ne rend pas les recherches faciles sur son seul nom.

Aller plus loin

  • # Comparatif avec wget

    Posté par . Évalué à 10.

    Merci pour ce récapitulatif !

    Il y a une page intéressante, écrite par Daniel lui-même, qui compare cURL avec wget.

    Perso, je n'ai jamais réussi à mémoriser la syntaxe de cURL, donc si je veux télécharger rapidement un fichier en ligne de commande, je finis toujours par utiliser wget <https://domain.tld/path/to/file.tgz>. Le lien ci-dessus m'a aussi permis de découvrir que cURL ne permet pas de faire du téléchargement récursif, contrairement à wget…

  • # Concurrents

    Posté par . Évalué à 6.

    De la même manière que pour la doc d'ES, swagger-ui génère des exemples de requêtes avec curl.

    Personnellement je me sert de 2 alternatives à curl en cli.

    • aria2 pour faire du téléchargement
      • l'interface est plus simple
      • il gère suffisamment de protocoles
      • permet de faire des choses sympas comme télécharger un même fichier depuis plusieurs url
    • httpie pour faire des requêtes sur des APIs
      • son ui est plus sympa pour passer les paramètres
      • il formate le json
      • il fait de la coloration
      • par contre je repasse à curl quand je passe par une authentification TLS par certificat
  • # curl -vvv, mon meilleur ami

    Posté par . Évalué à 6.

    Avec nslookup et netcat, curl est l'outil qui me sert le plus pour aider mes projets qui "n'arrive pas à se connecter à Truc". Réponse "que dit curl -vvv". Cela a le mérite de forcer le projet à construire sa requête car bien souvent il se contente de tester avec l'application métier et les 15 couches d'abstractions qu'il y a entre le bouton à cliquer et le flux http.

    merci pour l'article

    • [^] # Re: curl -vvv, mon meilleur ami

      Posté par . Évalué à 2.

      Même hors boulot quand une page ne réponds pas, j'ai plus l'habitude d'utiliser curl pour comprendre ce qu'il se passe que d'utiliser les outils de développeur de mon navigateur.

  • # FOSDEM 2017

    Posté par (page perso) . Évalué à 3.

    Pour ceux qui ne l'auraient pas vue je recommande la vidéo de sa conférence au FOSDEM.

  • # Bogue de locales rapidement corrigé

    Posté par (page perso) . Évalué à 3.

    Ceci qui a permis de remonter un bogue sur les locales dû au séparateur décimal qui était une virgule au lieu du point attendu dans la barre de progression pour le résultat final de 100,00 %.

    Et hop un bug pris et correctif appliqué par Daniel Stenberg

  • # Fichtre un acronyme récursif

    Posté par (page perso) . Évalué à 5.

    cURL pour « client URL request library »

    Ça faisait longtemps que je n'en avais pas appris un nouveau 😃

    kentoc'h mervel eget bezan saotred

    • [^] # Re: Fichtre un acronyme récursif

      Posté par (page perso) . Évalué à 3. Dernière modification le 30/04/18 à 14:53.

      Il n'est pas récursif.

      • [^] # Re: Fichtre un acronyme récursif

        Posté par (page perso) . Évalué à 2.

        Il y a quand même un niveau de récursion: cURL -> client URL request library -> client Uniform Resource Locator request library.

        • [^] # Re: Fichtre un acronyme récursif

          Posté par (page perso) . Évalué à 6.

          Selon moi « récursif » implique qu'on itère sur la même chose.
          Un acronyme récursif se contient donc lui-même. Il n'est donc pas possible qu'il n'y ai qu'une seule itération.

          Là je dirais plutôt que c'est un acronyme imbriqué ou quelque chose du genre.
          Je viens de vérifier : la page Wikipedia utilise le même terme.

          • [^] # Re: Fichtre un acronyme récursif

            Posté par (page perso) . Évalué à 3.

            C'est comme une fonction récursive, c'est une fonction qui s'appelle elle-même et pas une fonction qui appelle n'importe quelle fonction.

            « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

          • [^] # Re: Fichtre un acronyme récursif

            Posté par (page perso) . Évalué à 2.

            Récursif c'est un peu plus général. Par exemple un un célèbre algorithme récursif est le "quick sort", mais à chaque itération la fonction récursive est appelée sur un sous-ensemble du problème de départ, et la récursion s'arrête (sinon on a des problèmes).
            Dans les exemples de la page Wikipedia que tu as citée il y a GTK -> The GIMP Toolkit, la seconde itération ne contient pas l'acronyme initial.

            • [^] # Re: Fichtre un acronyme récursif

              Posté par . Évalué à 1.

              Il est syntaxiquement dans la page, mais la page dit : « L'acronyme récursif tygrographique est donc un acronyme auto-imbriqué. »
              Puis donne une liste d'exemples d'acronymes imbriqués, dont GIMP, puis une liste d'acronymes récursifs.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.