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, #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_headers, 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!, #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.
393 394 395 396 397 398 399 400 401 402 403 404 |
# File 'download_strategy.rb', line 393 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)
391 392 393 |
# File 'download_strategy.rb', line 391 def mirrors @mirrors end |
Instance Method Details
#clear_cache ⇒ Object
470 471 472 473 |
# File 'download_strategy.rb', line 470 def clear_cache super rm_rf(temporary_path) end |
#fetch(timeout: nil) ⇒ Object
Download and cache the file at AbstractFileDownloadStrategy#cached_location.
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 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 |
# File 'download_strategy.rb', line 409 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 if (domain = Homebrew::EnvConfig.artifact_domain) url = url.sub(%r{^https?://#{GitHubPackages::URL_DOMAIN}/}o, "#{domain.chomp("/")}/") 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: end_time&.remaining!) 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 use_cached_location = false if cached_location.exist? && last_modified && last_modified > cached_location.mtime if use_cached_location 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
475 476 477 478 |
# File 'download_strategy.rb', line 475 def resolved_time_file_size(timeout: nil) _, _, time, file_size = resolve_url_basename_time_file_size(url, timeout: timeout) [time, file_size] end |