Pour demander des documents à des serveurs Web, les navigateurs utilisent le protocole HTTP. Vous pouvez connaître ce nom dans votre barre d’adresse (il est peut-être masqué 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 texte simple. Cela fonctionne comme ceci:
Tout d'abord, votre navigateur se connecte au serveur du site Web et envoie l'URL du document qu'il souhaite télécharger (les pages Web sont également des documents) et quelques détails sur le navigateur lui - même ( User-Agent, etc.). Par exemple, pour charger la page principale sur le 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 le document que le serveur doit renvoyer. Les autres lignes sont appelées en-têtes; ils ressemblent à ceci:
Header name: Header value
Ces lignes envoient des informations supplémentaires qui aident le serveur à décider quoi faire.
Si tout va bien, le serveur répondra en envoyant 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 va bien, du contenu du document. Voici à quoi ressemble la réponse du serveur SuperUser à ma requête:
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
<!DOCTYPE html>
<html>
[...snip...]
</html>
Après la dernière ligne, le serveur de 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 retourner un document, comme demandé, et promet que le contenu qui va suivre sera un tel document. Si ce n'est pas le cas, le code sera autre chose et donnera 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 supposé renvoyer 404 Not Found
et si vous n'êtes pas autorisé à accéder au contenu en question, celui-ci est censé être renvoyé 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
.
Suivant est une ligne vide. Cela indique qu'il n'y aura plus d'en-têtes de réponse. Tout ce qui est au-delà de cette ligne correspond au contenu du document demandé. Ainsi, dans l'exemple ci-dessus, se <!DOCTYPE html>
trouve la première ligne de la page d'accueil de SuperUser (un document HTML). Si je demandais un document à télécharger, il s'agirait probablement de caractères charabia, car la plupart des formats de document sont illisibles sans traitement préalable.
Retour aux en-têtes. Le plus intéressant pour nous est le dernier, Content-Length
. Il indique au navigateur le nombre d'octets de données auxquels il doit s'attendre après la ligne vide. Il s'agit donc en gros de 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 est imprévisible (par exemple, lorsque le document est généré à la volée), parfois les programmeurs fainéants ne l'incluent pas (assez commun sur les sites de téléchargement de pilotes), parfois les sites Web sont créés par des débutants qui ne savent pas d'un tel en-tête.
Quoi qu'il en soit, quelle qu'en 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 envoyer et affiche donc la taille du document comme inconnue , attendant que le serveur ferme la connexion. Et c'est la raison pour laquelle la taille des documents est inconnue.