Pour demander des documents aux serveurs web, les navigateurs utilisent le protocole HTTP. Vous connaissez peut-être ce nom à partir de votre barre d'adresse (il est peut-être caché maintenant, mais lorsque vous cliquez sur la barre d'adresse, copiez l'URL et collez-la dans un éditeur de texte, vous verrez http://
au début). HTTP est un protocole simple basé sur du texte. Cela fonctionne ainsi :
Tout d'abord, votre navigateur se connecte au serveur du site web et envoie une URL du document qu'il souhaite télécharger (les pages web sont aussi des documents) et quelques détails sur le navigateur lui-même (User-Agent etc.). Par exemple, pour charger la page principale du site SuperUser, http://superuser.com/
, mon navigateur envoie une demande qui ressemble à ceci :
GET / HTTP/1.1
Host: superuser.com
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.0 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: pl-PL,pl;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: [removed for security]
DNT: 1
If-Modified-Since: Tue, 09 Jul 2013 07:14:17 GMT
La première ligne spécifie quel document le serveur devrait renvoyer. Les autres lignes sont appelées en-têtes ; elles ressemblent à ceci :
Nom de l'en-tête : Valeur de l'en-tête
Ces lignes envoient des informations supplémentaires qui aident le serveur à décider quoi faire.
Si tout se passe bien, le serveur répondra en renvoyant le document demandé. La réponse commence par un message d'état, suivi de quelques en-têtes (avec des détails sur le document) et enfin, si tout se passe bien, le contenu du document. Voici à quoi ressemble la réponse du serveur SuperUser pour ma demande :
HTTP/1.1 200 OK
Cache-Control: public, max-age=60
Content-Type: text/html; charset=utf-8
Expires: Tue, 09 Jul 2013 07:27:20 GMT
Last-Modified: Tue, 09 Jul 2013 07:26:20 GMT
Vary: *
X-Frame-Options: SAMEORIGIN
Date: Tue, 09 Jul 2013 07:26:19 GMT
Content-Length: 139672
[...snip...]
Après la dernière ligne, le serveur SuperUser ferme la connexion.
La première ligne (HTTP/1.1 200 OK
) contient le code de réponse, dans ce cas c'est 200 OK
. Cela signifie que le serveur a décidé qu'il peut renvoyer un document, comme demandé, et promet que le contenu qui suit sera bien un document. Si ce n'est pas le cas, le code sera différent, et il fournira une indication de la raison pour laquelle le serveur ne renvoie pas simplement un document en réponse : par exemple, s'il ne peut pas trouver le document demandé, il est censé renvoyer 404 Not Found
, et si vous n'êtes pas autorisé à accéder au contenu en question, il est censé renvoyer 403 Forbidden
.
Après cette première ligne d'état, les en-têtes de réponse suivent ; ils fournissent plus d'informations sur le contenu renvoyé, tel que son Content-type
.
Ensuite vient une ligne vide. Cela indique qu'il n'y aura pas d'autres en-têtes de réponse. Tout ce qui suit cette ligne est le contenu du document demandé. Ainsi, dans l'exemple ci-dessus, est la première ligne de la page d'accueil de SuperUser (un document HTML). Si je demandais un document à télécharger, il serait probablement composé de caractères sans signification, car la plupart des formats de document ne sont pas lisibles sans traitement préalable.
Revenons aux en-têtes. Le plus intéressant pour nous est le dernier, Content-Length
. Il indique au navigateur combien d'octets de données il devrait s'attendre après la ligne vide, donc en gros c'est la taille du document exprimée en octets. Cet en-tête n'est pas obligatoire et peut être omis par le serveur. Parfois, la taille du document ne peut pas être prédite (par exemple lorsque le document est généré à la volée), parfois les programmeurs négligents ne l'incluent pas (assez courant sur les sites de téléchargement de pilotes), parfois les sites web sont créés par des débutants qui ne connaissent pas l'existence d'un tel en-tête.
Quoi qu'il en soit, quelle que soit la raison, l'en-tête peut être manquant. Dans ce cas, le navigateur ne sait pas combien de données le serveur va renvoyer, et affiche donc la taille du document comme inconnue, en attendant que le serveur ferme la connexion. Et c'est la raison des tailles de document inconnues.