La sessione di domande e risposte di oggi ci viene fornita per gentile concessione di SuperUser, una suddivisione di Stack Exchange, un raggruppamento di domande e risposte basato sulla comunità.
La domanda
Lettore SuperUser Coldblackice vuole sapere perché il suo browser non mette sempre a repentaglio la sporcizia:
Occasionally, when downloading a file in a web browser, the download progress doesn’t “know” the total size of the file, or how far along in the download it is - it just shows the speed at which it’s downloading, with a total as “Unknown”.
Why wouldn’t the browser know the final size of some files? Where does it get this information in the first place?
Dove effettivamente?
Le risposte
Il collaboratore di SuperUser Gronostaj offre le seguenti informazioni:
To request documents from web servers, browsers use the HTTP protocol. You may know that name from your address bar (it may be hidden now, but when you click the address bar, copy the URL and paste it in some text editor, you’ll see
https://
all'inizio). È un semplice protocollo testuale e funziona così:
Innanzitutto, il browser si collega al server del sito Web e invia un URL del documento che desidera scaricare (anche le pagine Web sono documenti) e alcuni dettagli sul browser stesso (User-Agent, ecc.). Ad esempio, per caricare la pagina principale sul sito SuperUser,
https://superuser.com/
il mio browser invia una richiesta simile a questa:
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) 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 prima riga specifica quale documento deve essere restituito dal server. Le altre linee sono chiamate intestazioni; sembrano così:
Header name: Header value
Queste linee inviano informazioni aggiuntive che aiutano il server a decidere cosa fare.
Se tutto va bene, il server risponderà inviando il documento richiesto. La risposta inizia con un messaggio di stato, seguito da alcune intestazioni (con dettagli sul documento) e infine, se tutto va bene, il contenuto del documento. Ecco come appare la risposta del server SuperUser per la mia richiesta:
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…]
Dopo l'ultima riga, il server di SuperUser chiude la connessione.
La prima linea (
HTTP/1.1 200 OK
) contiene il codice di risposta, in questo caso lo è
200 OK
. Significa che il server restituirà un documento, come richiesto. Quando il server non riesce a farlo, il codice sarà un'altra cosa: probabilmente hai visto
404 Not Found
e
403 Forbidden
è abbastanza comune, anche. Quindi seguono le intestazioni.
Quando il browser trova una riga vuota nella risposta, sa che tutto quello che ha superato quella linea è il contenuto del documento richiesto. Quindi in questo caso
è la prima riga del codice della homepage di SuperUser. Se stavo richiedendo un documento da scaricare, probabilmente ci sarebbero alcuni caratteri senza senso, perché la maggior parte dei formati di documenti è illeggibile senza elaborazione precedente.
Torna alle intestazioni. Il più interessante per noi è l'ultimo,
Content-Length
. Informa il browser quanti byte di dati dovrebbero aspettarsi dopo la riga vuota, quindi in pratica è la dimensione del documento espressa in byte. Questa intestazione non è obbligatoria e può essere omessa dal server. A volte la dimensione del documento non può essere prevista (ad esempio quando il documento viene generato al volo), a volte i programmatori pigri non lo includono (abbastanza comune sui siti di download dei driver), a volte i siti Web sono creati da neofiti che non conoscono di tale intestazione.
Ad ogni modo, qualunque sia la ragione, l'intestazione può mancare. In tal caso il browser non sa quanti dati il server sta per inviare e visualizza quindi la dimensione del documento comesconosciuto, in attesa che il server chiuda la connessione. E questa è la ragione per le dimensioni del documento sconosciuto.
Hai qualcosa da aggiungere alla spiegazione? Sound off nei commenti. Vuoi leggere più risposte dagli altri utenti di Stack Exchange esperti di tecnologia? Controlla la discussione completa qui.