Pourquoi certains fichiers de téléchargement ne connaissent-ils pas leur propre taille?

De temps en temps, 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 la longueur du téléchargement, il montre simplement la vitesse de téléchargement, Total comme "inconnu".

Pourquoi le navigateur ne connaissait-il pas la taille finale de certains fichiers? D'où vient cette information en premier lieu?

Pour demander des documents à partir de serveurs Web, les navigateurs utilisent le protocole HTTP. Vous pouvez connaître ce nom de votre barre d'adresse (il 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 le texte. Cela fonctionne comme suit:

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 certains 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 quel document doit retourner le serveur. 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 certains en-têtes (avec des détails sur le document) et enfin, si tout va bien, le contenu du document. C'est ce que 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 <!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 les contenus suivants seront un tel document. Si ce n'est pas le cas, le code sera autre chose, et il fournira une indication de la raison pour laquelle le serveur ne retourne qu'un document comme réponse: par exemple, s'il ne peut pas trouver le document demandé, il est censé retourner 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 de statut, les en-têtes de réponse suivent; Ils fournissent plus d'informations sur le contenu renvoyé, tel que son Content-type .

La ligne suivante est une ligne vide. Cela signale le fait qu'il n'y aura plus d'en-têtes de réponse. Tout ce qui précède cette ligne correspond au contenu du document qu'il a demandé. Donc, dans l'exemple ci-dessus, <!DOCTYPE html> est la première ligne de la page d'accueil SuperUser (un document HTML). Si je demandais un document à télécharger, ce serait probablement des caractères gibberish, 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 combien d'octets de données il devrait s'attendre après la ligne vide, donc c'est essentiellement 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 commun sur les sites de téléchargement de pilote), parfois les sites Web sont créés par des débutants qui ne connaissent pas D'un tel en-tête.

Quoi qu'il en soit, l'en-tête peut manquer. Dans ce cas, le navigateur ne sait pas combien de données le serveur va envoyer et affiche ainsi la taille du document comme inconnue , en attendant que le serveur ferme la connexion. Et c'est la raison de la taille des documents inconnus.

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

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