diff --git a/Library/Homebrew/cask/audit.rb b/Library/Homebrew/cask/audit.rb index 88cd6859f0..62e067a3ae 100644 --- a/Library/Homebrew/cask/audit.rb +++ b/Library/Homebrew/cask/audit.rb @@ -805,7 +805,7 @@ module Cask if cask.url && !cask.url.using validate_url_for_https_availability(cask.url, "binary URL", cask.token, cask.tap, - user_agents: [cask.url.user_agent]) + user_agents: [cask.url.user_agent], referer: cask.url&.referer) end if cask.appcast && appcast? diff --git a/Library/Homebrew/test/utils/curl_spec.rb b/Library/Homebrew/test/utils/curl_spec.rb index 42bf3e8858..f810973afb 100644 --- a/Library/Homebrew/test/utils/curl_spec.rb +++ b/Library/Homebrew/test/utils/curl_spec.rb @@ -371,6 +371,14 @@ describe "Utils::Curl" do expect { curl_args(*args, retry_max_time: "test") }.to raise_error(TypeError) end + it "uses `--referer` when :referer is present" do + expect(curl_args(*args, referer: "https://brew.sh").join(" ")).to include("--referer https://brew.sh") + end + + it "doesn't use `--referer` when :referer is nil" do + expect(curl_args(*args, referer: nil).join(" ")).not_to include("--referer") + end + it "uses HOMEBREW_USER_AGENT_FAKE_SAFARI when `:user_agent` is `:browser` or `:fake`" do expect(curl_args(*args, user_agent: :browser).join(" ")) .to include("--user-agent #{HOMEBREW_USER_AGENT_FAKE_SAFARI}") diff --git a/Library/Homebrew/utils/curl.rb b/Library/Homebrew/utils/curl.rb index 049f889e96..7c89caae16 100644 --- a/Library/Homebrew/utils/curl.rb +++ b/Library/Homebrew/utils/curl.rb @@ -56,6 +56,7 @@ module Utils show_output: T.nilable(T::Boolean), show_error: T.nilable(T::Boolean), user_agent: T.any(String, Symbol, NilClass), + referer: T.nilable(String), ).returns(T::Array[T.untyped]) } def curl_args( @@ -66,7 +67,8 @@ module Utils retry_max_time: nil, show_output: false, show_error: true, - user_agent: nil + user_agent: nil, + referer: nil ) args = [] @@ -108,6 +110,8 @@ module Utils args << "--retry-max-time" << retry_max_time.round if retry_max_time.present? + args << "--referer" << referer if referer.present? + args + extra_args end @@ -238,7 +242,7 @@ module Utils set_cookie_header.compact.any? { |cookie| cookie.match?(/^(visid_incap|incap_ses)_/i) } end - def curl_check_http_content(url, url_type, specs: {}, user_agents: [:default], + def curl_check_http_content(url, url_type, specs: {}, user_agents: [:default], referer: nil, check_content: false, strict: false, use_homebrew_curl: false) return unless url.start_with? "http" @@ -254,6 +258,7 @@ module Utils hash_needed: true, use_homebrew_curl: use_homebrew_curl, user_agent: user_agent, + referer: referer, ) rescue Timeout::Error next @@ -276,6 +281,7 @@ module Utils hash_needed: hash_needed, use_homebrew_curl: use_homebrew_curl, user_agent: user_agent, + referer: referer, ) break if http_status_ok?(details[:status_code]) end @@ -364,7 +370,7 @@ module Utils def curl_http_content_headers_and_checksum( url, specs: {}, hash_needed: false, - use_homebrew_curl: false, user_agent: :default + use_homebrew_curl: false, user_agent: :default, referer: nil ) file = Tempfile.new.tap(&:close) @@ -385,7 +391,8 @@ module Utils connect_timeout: 15, max_time: max_time, retry_max_time: max_time, - user_agent: user_agent + user_agent: user_agent, + referer: referer ) parsed_output = parse_curl_output(output)