wiki/HowtocURL.md

231 lines
6.7 KiB
Markdown
Raw Normal View History

2016-10-06 11:04:37 +02:00
---
2017-04-12 09:36:46 +02:00
title: Howto curl
2016-10-06 11:04:37 +02:00
categories: tips
...
2017-04-12 09:31:29 +02:00
* Page de manuel : <https://curl.haxx.se/docs/manpage.html>
2017-03-17 17:00:17 +01:00
2017-05-18 12:15:55 +02:00
[curl](https://curl.haxx.se/) est un client [HTTP](HowtoHTTP) [libre](https://github.com/curl/curl/) en ligne de commande. Il supporte aussi d'autres protocoles (HTTPS, IMAP(S), LDAP(S), POP3(S), SSCP, SFTP, SMB, SMTP(S) etc.). Il est également intégré à de nombreux langages (PHP, Python, Ruby, Perl, etc. sous forme de bibliothèque (*libcurl*).
2017-03-17 17:00:17 +01:00
## Utilisation de base
2017-05-18 12:15:55 +02:00
Pour récupérer et afficher sur la sortie standard le contenu d'une ressource :
2017-03-17 17:00:17 +01:00
~~~
$ curl https://www.example.com
~~~
2017-05-18 13:55:22 +02:00
Pour afficher une version verbose de la requête (> Infos envoyées, < Infos reçues, * Infos supplémentaires) :
~~~
$ curl -v https://www.example.com
~~~
2017-05-18 12:15:55 +02:00
Pour faire une requête HEAD et donc afficher uniquement les entêtes de la réponse, utiliser l'option `-I` (ou `--head`) :
2017-03-17 17:00:17 +01:00
~~~
2017-05-18 12:15:55 +02:00
$ curl -I www.example.com
2017-03-17 17:00:17 +01:00
~~~
2017-05-18 12:15:55 +02:00
Pour enregistrer la ressource dans un fichier portant le même nom, utiliser l'option `-O` (ou `--remote-name`) :
2017-03-17 17:00:17 +01:00
~~~
2017-05-18 12:15:55 +02:00
$ curl -O https://www.example.com/page.html
2017-03-17 17:00:17 +01:00
~~~
2017-05-18 12:15:55 +02:00
Dans le cas d'un protocole s'appuyant sur SSL/TLS, pour ne pas vérifier la validité du certificat on ajoute l'option `-k` (ou `--insecure`) :
2017-03-17 17:00:17 +01:00
~~~
2017-05-18 12:15:55 +02:00
$ curl -k https://www.example.com/
2017-03-17 17:00:17 +01:00
~~~
2017-05-18 12:15:55 +02:00
Par défaut, curl ne suit pas les redirections HTTP, il faut l'option `-L` (ou `--location`) :
~~~
2017-05-18 12:15:55 +02:00
$ curl -L http://www.example.com
~~~
2017-05-18 12:15:55 +02:00
Pour spécifier un User-Agent, `-A` ou `--user-agent`) :
2017-04-10 15:42:47 +02:00
~~~
$ curl -A "Mozilla/5.0 (compatible; evolix; http://evolix.com)" http://example.com
~~~
2017-05-18 12:15:55 +02:00
Plus généralement, pour spécifier un entête HTTP utiliser l'option `-H` (ou `--header`) :
2017-03-17 17:00:17 +01:00
~~~
2017-05-18 12:15:55 +02:00
$ curl http://www.example.com -H 'Accept: text/plain'
2017-03-17 17:00:17 +01:00
~~~
2017-05-18 12:15:55 +02:00
## Forcer la résolution DNS
2017-03-17 17:00:17 +01:00
2017-05-18 12:15:55 +02:00
Lorsque l'on fait des tests, on a souvent besoin de forcer la résolution d'un enregistrement DNS vers une adresse IP spécifique.
L'astuce classique est de modifier le fichier HOSTS (`/etc/hosts` sous Linux et BSD) mais cela n'est pas très pratique pour diverses raisons (nécessite un accès _root_, cela change pour toutes les machines, il peut y avoir du cache).
2017-03-17 17:00:17 +01:00
2017-05-18 12:15:55 +02:00
Première astuce possible, modifier l'entête `Host` :
2017-03-17 17:00:17 +01:00
~~~
2017-05-18 12:15:55 +02:00
$ curl http://192.0.2.1:8080/foo/bar -H 'Host: www.example.com'
2017-03-17 17:00:17 +01:00
~~~
2017-05-18 12:15:55 +02:00
...les inconvénients sont qu'il faut modifier l'URL pour mettre l'adresse IP (ce qui ne permet pas de faire des copier/coller facilement) et que cela ne gère par le SNI (dans le cas de la couche SSL/TLS).
2017-03-17 17:00:17 +01:00
2017-05-18 12:15:55 +02:00
Une seconde astuce est d'utiliser l'option `--resolve` (à partir de curl 7.21.3) :
2017-03-17 17:00:17 +01:00
~~~
2017-05-18 12:15:55 +02:00
$ curl --resolve www.example.com:443:192.0.2.1 https://www.example.com/foo/bar
2017-03-17 17:00:17 +01:00
~~~
2017-05-18 12:15:55 +02:00
## Utilisation avancée
2017-05-18 12:15:55 +02:00
Pour envoyer une authentification HTTP, préciser l'option `-u` (ou `--user`) :
~~~
2017-05-18 12:15:55 +02:00
$ curl -u jdoe:PASSWORD https://www.example.com
~~~
2017-05-18 12:15:55 +02:00
Pour spécifier la méthode HTTP POST/PUT/DELETE (par défaut GET), cela se fait avec l'option `-X` (ou `--request`) :
2017-05-18 12:15:55 +02:00
~~~
$ curl -X POST https://www.example.com
~~~
2017-05-18 12:15:55 +02:00
**Attention**, cette option se contente de modifier le verbe HTTP indiqué dans l'en-tête de la requête et ne modifie pas du tout le comportement de curl vis-à-vis de la réponse. Pour en savoir plus sur les bons et mauvais usages de cette option : <https://daniel.haxx.se/blog/2015/09/11/unnecessary-use-of-curl-x/>
2016-10-06 11:04:37 +02:00
2017-03-08 20:12:55 +01:00
2017-05-18 12:15:55 +02:00
Pour afficher les entêtes **et** le contenu, utiliser l'option `-i` (ou `--include`) :
2017-03-08 20:22:28 +01:00
~~~
2017-05-18 12:15:55 +02:00
$ curl -i https://www.example.com
2017-03-08 20:22:28 +01:00
~~~
### En-têtes de requête et de réponse
2017-05-18 12:15:55 +02:00
À placer dans un script, pour faciliter son utilisation.
*Note*: Ce script permet de ne pas modifier le verbe HTTP employé. En effet, une requête "HEAD" peut-être traitée différemment d'un "GET" par certains services. Il peut être combiné avec toutes les options de Curl.
~~~{.bash}
#!/bin/sh
#
# https://github.com/rtomayko/dotfiles/blob/rtomayko/bin/headers
curl -sv "$@" 2>&1 >/dev/null |
grep -v "^\*" |
grep -v "^}" |
cut -c3-
~~~
~~~
$ ~/bin/headers http://www.example.com
GET / HTTP/1.1
User-Agent: curl/7.38.0
Host: www.example.com
Accept: */*
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: max-age=604800
Content-Type: text/html
Date: Mon, 27 Mar 2017 12:39:35 GMT
Etag: "359670651"
Expires: Mon, 03 Apr 2017 12:39:35 GMT
Last-Modified: Fri, 09 Aug 2013 23:54:35 GMT
Server: ECS (lga/13D5)
Vary: Accept-Encoding
X-Cache: HIT
Content-Length: 1270
[data not shown]
~~~
2017-05-18 12:15:55 +02:00
### Interactions avec une API REST
Pour tester des interactions avec une API REST, on peut facilement envoyer des structures de données.
En direct :
~~~
$ curl -XPUT 'http://localhost:9200/_snapshot/foo' -d '{
"type": "fs",
"settings": {
"location": "/home/backup-elasticsearch",
"compress": true
}
}'
~~~
Via un fichier :
~~~
$ curl -XPUT 'http://localhost:9200/_snapshot/foo' -d @/path/to/file
~~~
### Version compressée
2017-05-18 12:15:55 +02:00
Pour obtenir le contenu gzipé (avec un entête HTTP forcé) :
2017-03-08 20:12:55 +01:00
~~~
$ curl www.example.com -H 'Accept-Encoding:gzip, deflate'
2017-03-08 20:22:28 +01:00
~~~
2017-03-17 17:00:17 +01:00
2017-05-18 12:15:55 +02:00
### If-(M|Unm)odified-Since : contrainte sur la date de modification
2017-05-18 12:15:55 +02:00
Pour préciser l'entête HTTP `If-Modified-Since` et récupérer le contenu seulement si celui-ci a été modifié après le 17 Mars 2017, utiliser l'option (`-z` ou `--time-cond`) :
2017-03-17 17:00:17 +01:00
~~~
2017-05-18 12:15:55 +02:00
$ curl -z 17-Mar-17 https://www.example.com
2017-03-17 17:00:17 +01:00
~~~
2017-05-18 12:15:55 +02:00
Pour préciser l'entête HTTP `If-Unmodified-Since` et récupérer le contenu seulement si celui-ci a été modifié **avant** le 17 Mers 2017 :
2017-03-17 17:00:17 +01:00
~~~
2017-05-18 12:15:55 +02:00
$ curl -z -17-Mar-17 https://www.example.com
2017-03-17 17:00:17 +01:00
~~~
2017-05-15 09:40:26 +02:00
2017-05-18 12:15:55 +02:00
## Autres protocoles
### SMTP
Envoyer un email :
~~~
$ curl --mail-from foo@example.com --mail-rcpt bar@example.com smtp://example.com/
~~~
### FTP
Récupérer le fichier Debian.iso via FTP :
~~~
$ curl -u jdoe:PASSWORD -O ftp://ftp.example.com/foo/bar/Debian.iso
~~~
Lister le contenu d'un dossier :
~~~
$ curl ftp://ftp.example.com/foo/bar/
~~~
Envoyer des fichiers :
~~~
$ curl -u jdoe:PASSWORD -T fichier ftp://ftp.example.com/
$ curl -u jdoe:PASSWORD -T "{fichier1,fichier2}" ftp://ftp.example.com/
~~~
2017-05-18 12:29:16 +02:00
## FAQ
2017-05-18 12:15:55 +02:00
2017-05-18 12:29:16 +02:00
### Récupérer des requêtes pour curl via un navigateur
2017-05-15 09:40:26 +02:00
2017-05-18 12:29:16 +02:00
Dans Firefox et Chrome/Chromium (et probablement d'autres) il est possible de récupérer une commande curl reprenant exactement la requête que le navigateur a faite. C'est particulièrement pratique si on veut reproduire la requête et faire un debuggage plus fin. Il faut ouvrir le navigateur, dans la partie "réseau" et avec un clic-droit sur la ressource voulue, le menu déroulant proposera "Copy as curl" (ou similaire).
### curl VS cURL
2017-05-18 14:21:18 +02:00
cURL, ou see URL (« voir URL »), est le nom général du projet, qui englobe l'outil *curl* et la bibliothèque *libcurl* comme indiqué sur <https://daniel.haxx.se/docs/curl-vs-libcurl.html>. Mais Daniel Steinberg, le principal auteur de curl, [a dit qu'on pouvait utiliser ce qu'on veut !](https://twitter.com/bagder/status/788306535818625024).