Parfois, le fidèle compteur de progression de téléchargement sur votre navigateur (ou une autre application) jette simplement ses mains en l'air et renonce à afficher le temps de téléchargement restant. Pourquoi cloue-t-il parfois le temps de téléchargement prévu et échoue parfois à le rapporter tous ensemble?
La session de questions et réponses d’aujourd’hui nous est offerte par SuperUser, une subdivision de Stack Exchange, un regroupement de sites Web de questions-réponses géré par la communauté.
The Question
Le lecteur SuperUser Coldblackice veut savoir pourquoi son navigateur ne salit pas toujours:
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 son avancement dans le téléchargement - elle indique simplement la vitesse à laquelle il est téléchargé, avec un total comme «Inconnu».
Pourquoi le navigateur ne connaît-il pas la taille finale de certains fichiers? D'où vient cette information en premier lieu?
Où en effet?
Les réponses
Le contributeur SuperUser Gronostaj offre les informations suivantes:
Pour demander des documents aux serveurs Web, les navigateurs utilisent le protocole HTTP. Vous connaissez peut-ê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). C'est un protocole basé sur du texte simple et il fonctionne comme ceci: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 également des documents) et quelques détails sur le navigateur lui-même ( Agent utilisateur etc). Par exemple, pour charger la page principale sur le site SuperUser,
http://superuser.com/, mon navigateur envoie une requête qui ressemble à ceci:GET / HTTP / 1.1 Hébergeur: superuser.com Connexion: keep-alive Accepter: texte / html, application / xhtml + xml, application / xml; q = 0.9, * / *; q = 0.8 Agent utilisateur: Mozilla / 5.0 (Windows NT 6.1; WOW64) Accepter-encodage: gzip, dégonfler, sdch Accept-Language: pl-PL, pl; q = 0.8, en-US; q = 0.6, en; q = 0.4 Biscuit: [removed for security] DNT: 1 If-Modified-Since: mar, 09 juillet 2013 07:14:17 GMTLa première ligne spécifie le document que le serveur doit renvoyer. Les autres lignes sont appelées en-têtes; ils ressemblent à ceci:
Nom de l'en-tête: valeur de l'en-têteCes 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 demande:
HTTP / 1.1 200 OK Cache-Control: public, max-age = 60 Content-Type: texte / html; jeu de caractères = utf-8 Expire le: mar 09 juillet 2013 07:27:20 GMT Dernière mise à jour: Mar 09 juillet 2013 07:26:20 GMT Varier: * Options de X-Frame: SAMEORIGIN Date: mar 09 juillet 2013 07:26:19 GMT Content-Longueur: 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'est200 OK. Cela signifie que le serveur renverra un document, comme demandé. Lorsque le serveur n'y parvient pas, le code sera autre chose: vous avez probablement vu404 introuvable, et403 Interditest assez courant aussi. Ensuite, les en-têtes suivent.Lorsque le navigateur trouve une ligne vide dans la réponse, il sait que tout ce qui dépasse cette ligne correspond au contenu du document demandé. Donc dans ce cas
<! DOCTYPE html>est la première ligne du code de la page d’accueil du SuperUser. Si je demandais un document à télécharger, ce serait probablement des caractères charabiaques, car la plupart des formats de documents sont illisibles sans traitement préalable.Retour aux en-têtes. Le plus intéressant pour nous est le dernier,
Content-Length. Il informe le navigateur du nombre d'octets de données auquel il doit s'attendre après la ligne vide, c'est donc fondamentalement 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 paresseux 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 savent pas d'un tel en-tête.Quoi qu'il en soit, quelle qu'en soit la raison, l'en-tête peut manquer. 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 inconnue , en attendant que le serveur ferme la connexion. Et c’est la raison pour laquelle les formats de documents sont inconnus.