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, Homebrew::API::DownloadStrategy, HomebrewCurlDownloadStrategy, NoUnzipCurlDownloadStrategy
Instance Attribute Summary collapse
- #mirrors ⇒ Object readonly
Attributes inherited from AbstractDownloadStrategy
#cache, #cached_location, #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_headers, curl_http_content_headers_and_checksum, curl_output, curl_path, curl_response_follow_redirections, curl_response_last_location, curl_supports_fail_with_body?, curl_supports_tls13?, curl_version, curl_with_workarounds, http_status_ok?, parse_curl_output, url_protected_by_cloudflare?, url_protected_by_incapsula?
Methods included from SystemCommand::Mixin
#system_command, #system_command!
Methods inherited from AbstractFileDownloadStrategy
#basename, #cached_location, #symlink_location, #temporary_path
Methods inherited from AbstractDownloadStrategy
#basename, #quiet!, #quiet?, #source_modified_time, #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.
375 376 377 378 379 380 381 382 383 384 385 386 |
# File 'download_strategy.rb', line 375 def initialize(url, name, version, **) @try_partial = true @mirrors = .fetch(:mirrors, []) # Merge `:header` with `:headers`. if (header = .delete(:header)) [:headers] ||= [] [:headers] << header end super end |
Instance Attribute Details
#mirrors ⇒ Object (readonly)
373 374 375 |
# File 'download_strategy.rb', line 373 def mirrors @mirrors end |
Instance Method Details
#clear_cache ⇒ Object
454 455 456 457 |
# File 'download_strategy.rb', line 454 def clear_cache super rm_rf(temporary_path) end |
#fetch(timeout: nil) ⇒ Object
Download and cache the file at AbstractFileDownloadStrategy#cached_location.
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 440 441 442 443 444 445 446 447 448 449 450 451 452 |
# File 'download_strategy.rb', line 391 def fetch(timeout: nil) end_time = Time.now + timeout if timeout download_lock = DownloadLock.new(temporary_path) begin download_lock.lock urls = [url, *mirrors] begin url = urls.shift if (domain = Homebrew::EnvConfig.artifact_domain) url = url.sub(%r{^https?://#{GitHubPackages::URL_DOMAIN}/}o, "#{domain.chomp("/")}/") urls = [] if Homebrew::EnvConfig.artifact_domain_no_fallback? end ohai "Downloading #{url}" use_cached_location = cached_location.exist? use_cached_location = false if version.respond_to?(:latest?) && version.latest? resolved_url, _, last_modified, _, is_redirection = begin resolve_url_basename_time_file_size(url, timeout: Utils::Timer.remaining!(end_time)) rescue ErrorDuringExecution raise unless use_cached_location end # Authorization is no longer valid after redirects [:headers]&.delete_if { |header| header.start_with?("Authorization") } if is_redirection # The cached location is no longer fresh if Last-Modified is after the file's timestamp if cached_location.exist? && last_modified && last_modified > cached_location.mtime use_cached_location = false end if use_cached_location puts "Already downloaded: #{cached_location}" else begin _fetch(url:, resolved_url:, timeout: Utils::Timer.remaining!(end_time)) rescue ErrorDuringExecution raise CurlDownloadStrategyError, url end cached_location.dirname.mkpath temporary_path.rename(cached_location) end symlink_location.dirname.mkpath 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(unlink: true) end end |
#resolved_time_file_size(timeout: nil) ⇒ Object
459 460 461 462 |
# File 'download_strategy.rb', line 459 def resolved_time_file_size(timeout: nil) _, _, time, file_size = resolve_url_basename_time_file_size(url, timeout:) [time, file_size] end |