So, does the "pause" feature really work?
Sim, normalmente funciona.
Funciona da seguinte maneira: Sempre que você faz o download de um arquivo, você envia uma solicitação HTTP para o servidor com o arquivo em questão. O servidor responde com uma mensagem HTTP, que consiste em um cabeçalho e o conteúdo real.
Se o tamanho do arquivo solicitado é conhecido, o cabeçalho HTTP revela o "Content Length" para o seu navegador.
Por exemplo, estou tentando fazer o download de um arquivo PDF e esta é a resposta:
charon:~ werner$ curl -I www.ready.gov/business/_downloads/sampleplan.pdf
HTTP/1.1 200 OK
Server: Apache
ETag: "230b73353fc7715f06267967df11be04:1241094925"
Last-Modified: Wed, 29 Apr 2009 20:56:46 GMT
Accept-Ranges: bytes
Content-Length: 293125
Content-Type: application/pdf
Date: Wed, 07 Sep 2011 14:49:33 GMT
Connection: keep-alive
O que é importante sobre isso são os campos Content-Length
e Accept-Ranges
.
-
Accept-Ranges
significa que você pode acessar o arquivo parte por peça, se necessário -
Content-Length
informa o tamanho total do arquivo
Agora, quando você iniciar um download, o navegador baixará o arquivo como de costume, mas, é claro, também acompanhará os bytes baixados e armazenará tudo em um arquivo temporário. Se você clicar em "pausar", a conexão será apenas cancelada.
No entanto, como o navegador sabe o número de bytes baixados, quando você clica em "continuar", ele pode solicitar que o download do arquivo continue exatamente nesse ponto, com o campo HTTP Range
. Isso é tudo explicado nas Definições de campo de cabeçalho HTTP 1.1 :
HTTP retrieval requests using conditional or unconditional GET methods MAY request one or more sub-ranges of the entity, instead of the entire entity, using the Range request header, which applies to the entity returned as the result of the request.
O mais complicado é que, quando sua conexão está propensa a erros, o Chrome pode não perceber que houve uma perda de conexão, portanto, registrar um número errado de bytes baixados ou até mesmo falhar em retomar a conexão com o servidor. Eu não sei sobre o funcionamento interno do Chrome, mas pode não ser capaz de retomar um download se ele não puder enviar uma solicitação HTTP bem-sucedida.
De acordo com esta resposta , o Chrome teoricamente poderia considerar um download como" concluído ", mesmo que a conexão TCP tenha sido fechada / interrompida manualmente. Isso explicaria o "parece que está funcionando" que você descreveu.
Além disso, alguns servidores podem não suportar o comando Range
, embora eu ache que isso é raro. Alguns sites como o Rapidshare parecem impossibilitar a retomada de alguns downloads.
Por fim, você pode considerar usar um gerenciador de downloads e ver se isso resolve seus problemas. Além disso, usar o BitTorrent para baixar arquivos, se possível, é provavelmente a opção mais segura do que um simples download HTTP.