Para solicitar documentos de servidores da web, os navegadores usam o protocolo HTTP. Você pode saber esse nome na sua barra de endereços (pode estar oculto agora, mas quando você clica na barra de endereços, copia o URL e cola em algum editor de texto, você verá http://
no começo). HTTP é um protocolo simples baseado em texto. Funciona assim:
Primeiro, o navegador se conecta ao servidor do site e envia uma URL do documento que deseja baixar (as páginas da Web também são documentos) e alguns detalhes sobre o próprio navegador (User-Agent etc). Por exemplo, para carregar a página principal no site do SuperUser, http://superuser.com/
, meu navegador envia uma solicitação semelhante a esta:
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
A primeira linha especifica qual documento o servidor deve retornar. As outras linhas são chamadas de cabeçalhos; eles se parecem com isso:
Header name: Header value
Essas linhas enviam informações adicionais que ajudam o servidor a decidir o que fazer.
Se tudo estiver bem, o servidor responderá enviando o documento solicitado. A resposta começa com uma mensagem de status, seguida por alguns cabeçalhos (com detalhes sobre o documento) e, finalmente, se tudo estiver bem, o conteúdo do documento. É assim que a resposta do servidor do SuperUser para minha solicitação se parece:
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>
Após a última linha, o servidor do SuperUser fecha a conexão.
A primeira linha ( HTTP/1.1 200 OK
) contém o código de resposta , neste caso é 200 OK
. Isso significa que o servidor decidiu que pode retornar um documento, conforme solicitado, e promete que o conteúdo a seguir será esse documento. Se este não for o caso, o código será outra coisa, e fornecerá alguma indicação da razão pela qual o servidor não está apenas retornando um documento como a resposta: por exemplo, se não puder encontrar o documento solicitado, ele deve retornar 404 Not Found
, e se você não tiver permissão para acessar o conteúdo em questão, ele deve retornar 403 Forbidden
.
Após esta primeira linha de status, os cabeçalhos de resposta seguem; eles fornecem mais informações sobre o conteúdo que está sendo retornado, como Content-type
.
Em seguida, há uma linha vazia. Isso sinaliza o fato de que não haverá mais cabeçalhos de resposta. Tudo depois dessa linha é o conteúdo do documento solicitado. Portanto, no exemplo acima, <!DOCTYPE html>
é a primeira linha da home page do SuperUser (um documento HTML). Se eu estivesse solicitando um documento para download, provavelmente seriam alguns caracteres sem sentido, porque a maioria dos formatos de documentos é ilegível sem processamento prévio.
Voltar aos cabeçalhos. O mais interessante para nós é o último, Content-Length
. Ele informa ao navegador quantos bytes de dados ele deve esperar após a linha vazia, então basicamente é o tamanho do documento expresso em bytes. Este cabeçalho não é obrigatório e pode ser omitido pelo servidor. Às vezes, o tamanho do documento não pode ser previsto (por exemplo, quando o documento é gerado em tempo real), às vezes os programadores preguiçosos não o incluem (muito comum em sites de download de drivers), às vezes sites são criados por novatos que não sabem de tal cabeçalho.
De qualquer forma, seja qual for o motivo, o cabeçalho pode estar faltando. Nesse caso, o navegador não sabe quantos dados o servidor vai enviar e, portanto, exibe o tamanho do documento como desconhecido , aguardando que o servidor feche a conexão. E essa é a razão para tamanhos de documentos desconhecidos.