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
clear_path_cache, curl, curl_args, curl_check_http_content, curl_download, curl_executable, curl_http_content_headers_and_checksum, curl_output, curl_path, curl_response_follow_redirections, 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.
377 378 379 380 381 |
# File 'download_strategy.rb', line 377 def initialize(url, name, version, **) super @try_partial = true @mirrors = .fetch(:mirrors, []) end |
Instance Attribute Details
#mirrors ⇒ Object (readonly)
375 376 377 |
# File 'download_strategy.rb', line 375 def mirrors @mirrors end |
Instance Method Details
#clear_cache ⇒ Object
441 442 443 444 |
# File 'download_strategy.rb', line 441 def clear_cache super rm_rf(temporary_path) end |
#fetch(timeout: nil) ⇒ Object
Download and cache the file at AbstractFileDownloadStrategy#cached_location.
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 439 |
# File 'download_strategy.rb', line 386 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
446 447 448 449 |
# File 'download_strategy.rb', line 446 def resolved_time_file_size(timeout: nil) _, _, time, file_size = resolve_url_basename_time_file_size(url, timeout: timeout) [time, file_size] end |