RFC2616 "Protocolo de Transferência de Hipertexto - HTTP / 1.1", seção 14.5:
14.5 Accept-Ranges The Accept-Ranges response-header field allows the server to indicate its acceptance of range requests for a resource:
Accept-Ranges = "Accept-Ranges" ":" acceptable-ranges acceptable-ranges = 1#range-unit | "none"
Origin servers that accept byte-range requests MAY send
Accept-Ranges: bytes
but are not required to do so. Clients MAY generate byte-range requests without having received this header for the resource involved. Range units are defined in section 3.12.
Servers that do not accept any kind of range request for a resource MAY send
Accept-Ranges: none
to advise the client not to attempt a range request.
Em resumo, esse é o servidor remoto informando ao UA que está disposto a aceitar uma solicitação para apenas parte do recurso em questão, conforme descrito em RFC2616 seção 14.35 . Como esse é o mecanismo pelo qual a retomada de um download com falha é implementada, ver o cabeçalho Accept-Ranges
na resposta do servidor é realmente um bom sinal de que você conseguirá atingir sua meta aqui.
De fato, curl
parece implementar esse recurso, conforme descrito aqui ; as duas formas dadas do comando são:
cat file-that-failed-to-download.zip | curl -C - http://www.somewhere.com/file-I-want-to-download.zip >successfully-downloaded.zip
e
curl -C - -o partially_downloaded_file 'www.example.com/path/to/the/file'
Parece-me que ambas as formas devem comportar-se de forma mais ou menos idêntica, mas também não tentei, por isso não posso ter a certeza. Supondo que o Curl se comporte como anunciado, você deve simplesmente reemitir o mesmo comando (possivelmente com pequenas modificações, como na primeira forma em que você precisaria alterar os nomes dos arquivos) sempre que precisar retomar o download, e o Curl examinará o que você baixou até agora e emite um cabeçalho Range
especificando apenas os bytes restantes no arquivo.
Por que você não está vendo o cabeçalho Accept-Ranges
na resposta à sua solicitação original, talvez haja algum estado de alerta por parte do servidor, de modo que ele reconheça a segunda solicitação do seu UA para o mesmo recurso que inclui o cabeçalho Accept-Ranges
para garantir que seu UA esteja ciente de que uma tentativa de retomar o download será bem-sucedida. Em qualquer caso, isso não deve importar particularmente; de acordo com a citação do RFC acima, seu cliente pode (na ausência de um cabeçalho Accept-Ranges: none
pré-existente do servidor) emitir uma solicitação de intervalo de bytes se já viu o Accept-Ranges
ou não, e realmente não precisaria para especificar um intervalo na primeira solicitação em qualquer caso, já que ele está tentando baixar o recurso inteiro em vez de apenas parte dele.