Class: CurlDownloadStrategy
- Inherits:
-
AbstractFileDownloadStrategy
- Object
- AbstractDownloadStrategy
- AbstractFileDownloadStrategy
- CurlDownloadStrategy
- Includes:
- Utils::Curl
- Defined in:
- download_strategy.rb
Overview
Strategy for downloading files using curl
.
Direct Known Subclasses
CurlApacheMirrorDownloadStrategy, CurlGitHubPackagesDownloadStrategy, CurlPostDownloadStrategy, HomebrewCurlDownloadStrategy, NoUnzipCurlDownloadStrategy
Instance Attribute Summary collapse
-
#mirrors ⇒ Object
readonly
Attributes inherited from AbstractDownloadStrategy
#cache, #cached_location, #source_modified_time, #url
Instance Method Summary collapse
-
#clear_cache ⇒ Object
-
#fetch(timeout: nil) ⇒ Object
Download and cache the file at AbstractFileDownloadStrategy#cached_location.
-
#initialize(url, name, version, **meta) ⇒ CurlDownloadStrategy
constructor
A new instance of CurlDownloadStrategy.
-
#resolved_time_file_size(timeout: nil) ⇒ Object
Methods included from Utils::Curl
curl, curl_args, curl_check_http_content, curl_download, curl_executable, curl_http_content_headers_and_checksum, curl_output, curl_path, curl_response_last_location, curl_supports_tls13?, curl_with_workarounds, http_status_ok?, parse_curl_output, url_protected_by_cloudflare?, url_protected_by_incapsula?
Methods inherited from AbstractFileDownloadStrategy
#basename, #cached_location, #symlink_location, #temporary_path
Methods inherited from AbstractDownloadStrategy
#basename, #quiet?, #shutup!, #stage
Methods included from Context
current, current=, #debug?, #quiet?, #verbose?, #with_context
Constructor Details
#initialize(url, name, version, **meta) ⇒ CurlDownloadStrategy
Returns a new instance of CurlDownloadStrategy.
376 377 378 379 380 |
# File 'download_strategy.rb', line 376 def initialize(url, name, version, **) super @try_partial = true @mirrors = .fetch(:mirrors, []) end |
Instance Attribute Details
#mirrors ⇒ Object (readonly)
374 375 376 |
# File 'download_strategy.rb', line 374 def mirrors @mirrors end |
Instance Method Details
#clear_cache ⇒ Object
440 441 442 443 |
# File 'download_strategy.rb', line 440 def clear_cache super rm_rf(temporary_path) end |
#fetch(timeout: nil) ⇒ Object
Download and cache the file at AbstractFileDownloadStrategy#cached_location.
385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 |
# File 'download_strategy.rb', line 385 def fetch(timeout: nil) end_time = Time.now + timeout if timeout download_lock = LockFile.new(temporary_path.basename) download_lock.lock urls = [url, *mirrors] begin url = urls.shift ohai "Downloading #{url}" resolved_url, _, url_time, _, is_redirection = resolve_url_basename_time_file_size(url, timeout: end_time&.remaining!) # Authorization is no longer valid after redirects [:headers]&.delete_if { |header| header.start_with?("Authorization") } if is_redirection fresh = if cached_location.exist? && url_time url_time <= cached_location.mtime elsif version.respond_to?(:latest?) !version.latest? else true end if cached_location.exist? && fresh puts "Already downloaded: #{cached_location}" else begin _fetch(url: url, resolved_url: resolved_url, timeout: end_time&.remaining!) rescue ErrorDuringExecution raise CurlDownloadStrategyError, url end ignore_interrupts do cached_location.dirname.mkpath temporary_path.rename(cached_location) symlink_location.dirname.mkpath end end FileUtils.ln_s cached_location.relative_path_from(symlink_location.dirname), symlink_location, force: true rescue CurlDownloadStrategyError raise if urls.empty? puts "Trying a mirror..." retry rescue Timeout::Error => e raise Timeout::Error, "Timed out downloading #{self.url}: #{e}" end ensure download_lock&.unlock download_lock&.path&.unlink end |
#resolved_time_file_size(timeout: nil) ⇒ Object
445 446 447 448 |
# File 'download_strategy.rb', line 445 def resolved_time_file_size(timeout: nil) _, _, time, file_size = resolve_url_basename_time_file_size(url, timeout: timeout) [time, file_size] end |