Parfois, lors du téléchargement d’un fichier dans un navigateur Web, la progression du téléchargement ne "connaît" pas la taille totale du fichier, ni sa progression dans le téléchargement. Elle indique simplement la vitesse à laquelle il est téléchargé, avec total en tant que "inconnu".
Pourquoi le navigateur ne connaît-il pas la taille finale de certains fichiers? Où trouve-t-il cette information en premier lieu?
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, le code http://
apparaît 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), ainsi que des 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 il s'agit de 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, il est supposé 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
.
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, <!DOCTYPE html>
est 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 ne peut pas être prédite (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 sous la forme unknown , en attendant que le serveur ferme la connexion. Et c'est la raison pour laquelle la taille des documents est inconnue.
L'en-tête HTTP Content-Length
est facultatif dans certains cas et, en tant que tel, il peut ne pas être transmis avec le fichier; la fin du fichier sera signalée lors de la fermeture du socket.
Lorsque le contenu (par exemple un document .pdf
ou une feuille Excel) est créé à la volée, la taille ne peut pas être connue auparavant. Dans ce cas, le serveur ne peut pas vous envoyer la taille du téléchargement auparavant et le navigateur ne peut pas afficher la taille totale.