7.1 KiB
Howto HTTP
Le procotole HTTP (HyperText Transfer Protocol) est un protocole client/serveur de niveau 7 s'appuyant par convention sur la couche de transport TCP et le port 80. Sa version sécurisée est HTTPS qui ajoute la couche SSL/TLS.
Comprendre les différentes versions de HTTP grâce à telnet
HTTP/1.0
La version la plus simple, l'entête Host:
est facultatif :
$ telnet www.debian.org 80
Trying 5.153.231.4...
Connected to www.debian.org.
Escape character is '^]'.
GET / HTTP/1.0
HTTP/1.1 200 OK
Date: Wed, 05 Oct 2016 02:09:37 GMT
Server: Apache
Last-Modified: Fri, 08 Jan 2016 22:27:31 GMT
ETag: "1d8-528da17d9b160"
Accept-Ranges: bytes
Content-Length: 472
Vary: Accept-Encoding
X-Clacks-Overhead: GNU Terry Pratchett
Connection: close
Content-Type: text/html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
[...]
Connection closed by foreign host.
HTTP/1.1
L'entête Host:
est obligatoire :
$ telnet www.debian.org 80
Trying 5.153.231.4...
Connected to www.debian.org.
Escape character is '^]'.
GET / HTTP/1.1
Host: www.debian.org
HTTP/1.1 200 OK
Date: Wed, 05 Oct 2016 02:11:37 GMT
Server: Apache
Content-Location: index.en.html
Vary: negotiate,accept-language,Accept-Encoding
TCN: choice
Last-Modified: Tue, 04 Oct 2016 15:27:56 GMT
ETag: "3baf-53e0bb4711c9f"
Accept-Ranges: bytes
Content-Length: 15279
Cache-Control: max-age=86400
Expires: Thu, 06 Oct 2016 02:11:37 GMT
X-Clacks-Overhead: GNU Terry Pratchett
Connection: close
Content-Type: text/html
Content-Language: en
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="en">
[...]
Connection closed by foreign host.
HTTPS
On gère le tunnel SSL avec openssl
puis tout est en clair :
$ openssl s_client -host www.debian.org -port 443
CONNECTED(00000003)
depth=3 C = SE, O = AddTrust AB, OU = AddTrust External TTP Network, CN = AddTrust External CA Root
verify return:1
depth=2 C = US, ST = New Jersey, L = Jersey City, O = The USERTRUST Network, CN = USERTrust RSA Certification Authority
verify return:1
depth=1 C = FR, ST = Paris, L = Paris, O = Gandi, CN = Gandi Standard SSL CA 2
verify return:1
depth=0 OU = Domain Control Validated, OU = Gandi Standard SSL, CN = debian.org
verify return:1
---
Certificate chain
0 s:/OU=Domain Control Validated/OU=Gandi Standard SSL/CN=debian.org
i:/C=FR/ST=Paris/L=Paris/O=Gandi/CN=Gandi Standard SSL CA 2
1 s:/C=FR/ST=Paris/L=Paris/O=Gandi/CN=Gandi Standard SSL CA 2
[...]
Start Time: 1475633567
Timeout : 300 (sec)
Verify return code: 0 (ok)
---
GET / HTTP/1.0
HTTP/1.1 200 OK
Date: Wed, 05 Oct 2016 02:12:56 GMT
Server: Apache
[...]
HTTP/2.0
Voir https://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol/2
Outils HTTP
Commandes HEAD/GET/POST
Il s'agit de commandes HEAD, GET, POST faisant partie de la bibliothèque LWP (WWW Library for Perl) :
# apt install libwww-perl
Utilisation :
$ HEAD www.evolix.fr
200 OK
Connection: close
Date: Tue, 28 Dec 2010 20:08:35 GMT
Server: Apache
Vary: Accept-Encoding
Content-Type: text/html
Client-Date: Tue, 28 Dec 2010 20:08:44 GMT
Client-Peer: 85.31.205.43:80
Client-Response-Num: 1
$ GET -Sd evolix.fr
GET http://evolix.fr
301 Moved Permanently
GET http://www.evolix.fr/
301 Moved Permanently
GET http://evolix.com/
200 OK
$ HEAD -U -H "User-Agent: Mozilla/4.8 [en] (Windows NT 5.1; fr; rv:BlogByGcolpart)" \
-H "Referer: http://www.evolix.fr/" www.evolix.fr/serv/infogerance.html
HEAD http://www.evolix.fr/serv/infogerance.html
Referer: http://www.evolix.fr/
User-Agent: Mozilla/4.8 [en] (Windows NT 5.1; fr; rv:BlogByGcolpart)
200 OK
Connection: close
Date: Thu, 13 Jan 2011 23:14:13 GMT
Server: Apache
Vary: Accept-Encoding
Content-Type: text/html
Client-Date: Thu, 13 Jan 2011 23:14:13 GMT
Client-Peer: 85.31.205.43:80
Client-Response-Num: 1
$ GET -dUe google.fr
GET http://www.google.fr/
User-Agent: lwp-request/6.03 libwww-perl/6.08
200 OK
Cache-Control: private, max-age=0
Connection: close
Date: Thu, 18 May 2017 12:00:13 GMT
Accept-Ranges: none
Server: gws
Vary: Accept-Encoding
Content-Type: text/html; charset=ISO-8859-1
Expires: -1
Client-Date: Thu, 18 May 2017 12:00:13 GMT
Client-Peer: 216.58.210.195:80
Client-Response-Num: 1
Link: </images/branding/product/ico/googleg_lodp.ico>; rel="shortcut icon"
P3P: CP="This is not a P3P policy! See https://www.google.com/support/accounts/answer/151657?hl=en for more info."
Set-Cookie: NID=103=UEe-aKr4jwguVRZw_irgQQo6WviJ2ZArnM9iCouDcPzBV_RZk4YiR4I13Kn1JSO-Gbcowcw5W1BtUTCd7pQt7H6_zKK6zf8EVb2GG5Yb_ariD0aWeAJxHFf2sRMkZXTi; expires=Fri, 17-Nov-2017 12:00:13 GMT; path=/; domain=.google.fr; HttpOnly
Title: Google
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
$ GET http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.36.2.tar.bz2 > linux-2.6.36.2.tar.bz2
$ GET google.fr | grep charset= | sed 's@^.*charset=\([-a-Z0-9]*\)".*$@\1@'
ISO-8859-1
$ POST http://www.evolix.fr/contacts.html
Please enter content (application/x-www-form-urlencoded) to be POSTed:
from=jdoe%40example.com&contenu=Coucou&validation=nospam&soumettre=ok
Ctrl+d
$ echo -n "from=jdoe%40example.com&contenu=Coucou&validation=nospam&soumettre=ok" > /tmp/POST-DATA.txt
$ POST http://www.evolix.fr/contacts.html < /tmp/POST-DATA.txt
Note : Attention, pour envoyer interactivement des données en POST, il faut ensuite les valider avec Ctrl+d
Voici les différentes options possibles :
-U
: affiche les entêtes envoyés-e
: affiche les entêtes reçus (s'utilise avec GET/POST car c'est le défaut pour HEAD)-d
: ne pas afficher la réponse (à utiliser avec-dUe
ou-dS
par exemple)-H
: envoyer un entête HTTP particulier-S
: affiche les redirections HTTP suivies
wget
# apt install wget
wget est un client HTTP en ligne de commande.
Exemples d'utilisation :
$ wget --limit-rate=100K -A *.mpeg -r http://dc5video.debian.net/2005-07-09/
$ http_proxy=http://192.168.14.4:3128 wget -p -H www.thomascook.fr
Voici les différentes options possibles :
-c
: pour reprendre un téléchargement déjà commencé--limit-rate=100k
: pour limiter le téléchargement à 100 Ko/s-r
: téléchargement récursif d'un site (mode « aspirateur »)-l <niveau>
(défaut=5) : niveau de répertoires à explorer pour l'aspirateur (-l 0
: aucun)-a <regex>
: pour limiter à une expression régulière-P <foo>
: pour spécifier le répertoire foo/ où mettre le contenu téléchargé (au lieu du répertoire courant)-p
: prendre tous les fichiers dont la page a besoin-H
: active le teléchargement de « pages exterieures » au site demandé
cURL
cURL est aussi un client HTTP en ligne de commande.
Voir HowtocURL
ab : apache bench
# apt install apache2-utils
Utilisation :
$ ab -n 1000 -c 100 -l http://127.0.0.1/helloworld.txt
-n
: nombre de requêtes-c
: nombre de requêtes effectuées en simultané-l
: option importante qui tolère la variation de la réponse du serveur (si non, les requêtes seront notées en Failed requests)-k
: active le HTTP KeepAlive
Tsung
Voir HowtoTsung