utils/curl: support disabling partial downloads in curl_download

This commit is contained in:
Bo Anderson 2020-07-02 18:58:32 +01:00
parent 2970d2e4f9
commit 997ba42a4b

View File

@ -54,21 +54,25 @@ def curl(*args, secrets: [], **options)
secrets: secrets secrets: secrets
end end
def curl_download(*args, to: nil, **options) def curl_download(*args, to: nil, partial: true, **options)
destination = Pathname(to) destination = Pathname(to)
destination.dirname.mkpath destination.dirname.mkpath
range_stdout = curl_output("--location", "--range", "0-1", if partial
"--dump-header", "-", range_stdout = curl_output("--location", "--range", "0-1",
"--write-out", "%\{http_code}", "--dump-header", "-",
"--output", "/dev/null", *args, **options).stdout "--write-out", "%\{http_code}",
headers, _, http_status = range_stdout.partition("\r\n\r\n") "--output", "/dev/null", *args, **options).stdout
headers, _, http_status = range_stdout.partition("\r\n\r\n")
supports_partial_download = http_status.to_i == 206 # Partial Content supports_partial_download = http_status.to_i == 206 # Partial Content
if supports_partial_download && if supports_partial_download &&
destination.exist? && destination.exist? &&
destination.size == %r{^.*Content-Range: bytes \d+-\d+/(\d+)\r\n.*$}m.match(headers)&.[](1)&.to_i destination.size == %r{^.*Content-Range: bytes \d+-\d+/(\d+)\r\n.*$}m.match(headers)&.[](1)&.to_i
return # We've already downloaded all the bytes return # We've already downloaded all the bytes
end
else
supports_partial_download = false
end end
continue_at = if destination.exist? && supports_partial_download continue_at = if destination.exist? && supports_partial_download