From 046b0490308b610a3cb87b7161166874b7d27696 Mon Sep 17 00:00:00 2001 From: Jeremy Lecour Date: Mon, 27 Mar 2017 14:49:59 +0200 Subject: [PATCH] =?UTF-8?q?Curl:=20ajout=20d'astuces=20et=20de=20pr=C3=A9c?= =?UTF-8?q?isions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HowtocURL.md | 102 +++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 91 insertions(+), 11 deletions(-) diff --git a/HowtocURL.md b/HowtocURL.md index 2722189a..ea047e59 100644 --- a/HowtocURL.md +++ b/HowtocURL.md @@ -10,45 +10,53 @@ categories: tips ## Utilisation de base +Récupérer et afficher – sur la sortie standard – le contenu d'une ressource : + ~~~ $ curl https://www.example.com ~~~ -Enregistrer en local : +Enregistrer la ressource dans un fichier portant le même nom (`-O ou `--remote-name`) : ~~~ -$ curl -O https://www.example.com/ +$ curl -O https://www.example.com/page.html ~~~ -Ignorer le certificat : +Ne pas vérifier la validité du certificat (`-k` ou `--insecure`) : ~~~ $ curl -k https://www.example.com/ ~~~ -Suivre les redirect 301 : +Suivre les redirections (`-L` ou `--location`) : ~~~ $ curl -L http://www.example.com ~~~ -Spécifier la méthode (par défaut GET) POST/PUT/DELETE : +Spécifier la méthode (par défaut GET) POST/PUT/DELETE (`-X` ou `--request`) : ~~~ $ curl -X POST https://www.example.com ~~~ +Spécifier un en-tête HTTP (`-H` ou `--header`) : + +~~~ +$ curl http://www.example.com -H 'Accept: text/plain' +~~~ + ## Outrepasser le nom de domaine Avec cette astuce, inutile de modifier `/etc/hosts`, ce qui est très pratique. -En HTTP classique : +Avec un en-tête `Host` forcé : ~~~ $ curl http://192.0.2.1:8080/foo/bar -H 'Host: www.example.com' ~~~ -En HTTPS (SNI) : +Avec une résolution forcée (`--resolve`, à partir de 7.21.3) : ~~~ $ curl --resolve www.example.com:443:192.0.2.1 https://www.example.com/foo/bar @@ -56,6 +64,8 @@ $ curl --resolve www.example.com:443:192.0.2.1 https://www.example.com/foo/bar ## Authentification +Option `-u` ou `--user` : + ~~~ $ curl -u username:password https://www.example.com ~~~ @@ -90,26 +100,96 @@ $ curl -u ftpuser:ftppass -T fichier ftp://ftp.example.com/ $ curl -u ftpuser:ftppass -T "{fichier1,fichier2}" ftp://ftp.example.com/ ~~~ +## 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 +~~~ + ## Divers -Afficher uniquement le header : +### Affichage de la réponse + +Afficher uniquement les en-têtes (`-I` ou `--head`) : ~~~ $ curl -I www.example.com ~~~ -Afficher le header et le contenu : +Afficher les en-têtes et le contenu (`-i` ou `--include`) : + ~~~ $ curl -i www.example.com ~~~ -Obtenir le contenu gzipé : +### En-têtes de requête et de réponse + +À plaver 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] +~~~ + +### Version compressée + +Obtenir le contenu gzipé (avec un en-tête forcé) : ~~~ $ curl www.example.com -H 'Accept-Encoding:gzip, deflate' ~~~ -Récupérer le contenu seulement si celui-ci a été modifié après le 17 Mers 2017 : +### Contrainte de date de modification de la ressource + +Récupérer le contenu seulement si celui-ci a été modifié après le 17 Mars 2017 (`-I` ou `--head`) : ~~~ $ curl -z 17-Mar-17 www.example.com