minimal/http

Protocole HTTP

Requêtes et réponses HTTP

Une requête HTTP est un flux d’octets (un texte) envoyé par le client vers le serveur au travers du réseau. Elle est structurée en lignes.

Exemple d’une requête de type GET :

GET /api HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Host: yesno.wtf
User-Agent: HTTPie/0.9.9

En retour, le serveur renvoie une réponse à cette requête, avec une structure analogue.

Exemple de réponse à la requête précédente :

Status: 200 OK
Transfer-Encoding: chunked
X-Powered-By: Phusion Passenger 5.0.1
access-control-allow-origin: *
access-control-request-method: *
cache-control: max-age=0, private, must-revalidate
etag: "c869ad1693dfe675a79a187fa6c1020e"
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-request-id: a6d669c1-401d-4355-aa9a-9dfcd97859a3
x-runtime: 0.002400
x-xss-protection: 1; mode=block

{
    "answer": "no",
    "forced": false,
    "image": "https://yesno.wtf/assets/no/32-b62f1f8058c1d7f06c528319faccfb38.gif"
}

Les requêtes sont souvent envoyées par les navigateurs web :

  • obtention du contenu d’une page
  • obtention du contenu d’un fichier de script (js) ou de style (css)
  • post des données d’un formulaire
  • appel d’un webservice, sur le serveur d’origine ou sur un autre serveur (cross-origin)

Elles peuvent aussi être envoyées par tout type de programme ou d’application.

Par exemple, la commande GNU curl permet facilement d’envoyer des requêtes à un serveur et d’en afficher la réponse :

$ curl https://www.google.fr
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="fr">...
$ curl -v https://yesno.wtf/api
*   Trying 188.166.14.102...
* TCP_NODELAY set
* Connected to yesno.wtf (188.166.14.102) port 443 (#0)
* TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
* Server certificate: yesno.wtf
* Server certificate: Let's Encrypt Authority X3
* Server certificate: DST Root CA X3
> GET /api HTTP/1.1
> Host: yesno.wtf
> User-Agent: curl/7.54.0
> Accept: */*
> 
< HTTP/1.1 200 OK
< Content-Type: application/json; charset=utf-8
< Transfer-Encoding: chunked
< Connection: keep-alive
< Status: 200 OK
< cache-control: max-age=0, private, must-revalidate
< access-control-allow-origin: *
< etag: "54694ab8db834baa0e059c0059b98138"
< x-frame-options: SAMEORIGIN
< x-xss-protection: 1; mode=block
< x-content-type-options: nosniff
< x-runtime: 0.002188
< access-control-request-method: *
< x-request-id: 71260bd1-6ec5-475c-b9b2-9c04697b7b91
< Date: Fri, 24 Aug 2018 07:28:41 GMT
< X-Powered-By: Phusion Passenger 5.0.1
< Server: nginx/1.6.2 + Phusion Passenger 5.0.1
< 
* Connection #0 to host yesno.wtf left intact
{"answer":"no","forced":false,"image":"https://yesno.wtf/assets/no/18-1ba72d815ec0e2bff8dba8699a50e275.gif"}

Principaux headers

Headers de la requête

  • Content-Type, type du média du body de la requête

    Content-Type: application/json
    Content-Type: application/json; charset=UTF-8
    Content-Type: text/html
  • Accept indique quels sont les types de contenu, exprimés sous la forme de types MIME, que le client sera capable d’interpréter

Headers de la réponse

  • Content-Type, type du média du body de la réponse

    Content-Type: application/json
    Content-Type: text/html
  • cache-control

    cache-control: max-age=0, private, must-revalidate

Cookies

Un cookie est une paire (clé, valeur) qui est stockée dans un espace dédié du navigateur, associé au nom de domaine appelé.

Un serveur peut mettre dans une response HTTP un ordre de stockage d’un nouveau cookie dans le navigateur client :

Set-Cookie: token=JjlmIyAZuV6u6HY4R8Vl8byOhvkkLzZDTcgTD7Paehe3xLy4VI; mode=dev;

Lors de chaque requête sur le même nom de domaine, le navigateur inclue systématiquement tous les cookies dans la requête HTTP, dans une ligne (attention à l’espace après ;) :

Cookie: key1=value1; key2=value2;

Exemple:

GET /spec.html HTTP/1.1
Host: www.example.org
Cookie: token=JjlmIyAZuV6u6HY4R8Vl8byOhvkkLzZDTcgTD7Paehe3xLy4VI; mode=dev; 
--cookie "key=value"