Check for range support instead of rescuing error.

This commit is contained in:
Markus Reiter 2018-09-06 16:25:08 +02:00
parent 34061628e6
commit 072127197a
3 changed files with 12 additions and 13 deletions

View File

@ -641,7 +641,7 @@ module Homebrew
# We're in the cache; make sure to force re-download
loop do
begin
curl_download url, continue_at: 0, to: filename
curl_download url, to: filename
break
rescue
if retry_count >= max_curl_retries

View File

@ -262,7 +262,7 @@ describe CurlDownloadStrategy do
expect(subject).to receive(:curl).with(
"--location",
"--remote-time",
"--continue-at", "-",
"--continue-at", "0",
"--output", an_instance_of(Pathname),
url,
an_instance_of(Hash)

View File

@ -46,21 +46,20 @@ def curl(*args)
env: { "SSL_CERT_FILE" => nil }
end
def curl_download(*args, to: nil, continue_at: "-", **options)
def curl_download(*args, to: nil, **options)
destination = Pathname(to)
had_incomplete_download ||= destination.exist?
destination.dirname.mkpath
curl("--location", "--remote-time", "--continue-at", continue_at.to_s, "--output", destination, *args, **options)
rescue ErrorDuringExecution => e
# `curl` error 33: HTTP server doesn't seem to support byte ranges. Cannot resume.
# HTTP status 416: Requested range not satisfiable
if (e.status.exitstatus == 33 || had_incomplete_download) && continue_at == "-"
continue_at = 0
had_incomplete_download = false
retry
continue_at = if destination.exist? &&
curl_output("--location", "--head", "--range", "0-1",
"--write-out", "%{http_code}",
"--output", "/dev/null", *args, **options).stdout.to_i == 206 # Partial Content
"-"
else
0
end
raise
curl("--location", "--remote-time", "--continue-at", continue_at.to_s, "--output", destination, *args, **options)
end
def curl_output(*args, **options)