88 votes

Pourquoi certains fichiers téléchargés ne connaissent-ils pas leur propre taille?

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, ou à quel point le téléchargement est avancé - elle affiche simplement la vitesse à laquelle le téléchargement se fait, avec un total comme "Inconnu".

Pourquoi le navigateur ne connaîtrait-il pas la taille finale de certains fichiers ? D'où tire-t-il cette information en premier lieu ?

119voto

gronostaj Points 50460

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.

55voto

L'en-tête HTTP Content-Length est optionnel dans certains cas et, en tant que tel, il peut ne pas être transmis avec le fichier; la fin du fichier sera signalée lorsque le socket est fermé.

4voto

Lorsque le contenu (par exemple un document .pdf ou une feuille Excel) est généré à la volée, la taille ne peut pas être connue à l'avance. Dans ces cas, le serveur ne peut pas vous envoyer la taille du téléchargement avant et le navigateur ne peut pas afficher la taille totale.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X