Skip to content

Commit

Permalink
Merge pull request Homebrew#17412 from samford/curl-work-with-8-exit_…
Browse files Browse the repository at this point in the history
…status

Curl#curl_headers: Work with 8 exit_status
  • Loading branch information
MikeMcQuaid committed Jun 4, 2024
2 parents 4814f45 + 8236a70 commit b5a8efc
Showing 1 changed file with 17 additions and 4 deletions.
21 changes: 17 additions & 4 deletions Library/Homebrew/utils/curl.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,13 @@ module Curl
include SystemCommand::Mixin
extend SystemCommand::Mixin

# Error returned when the server sent data curl could not parse.
CURL_WEIRD_SERVER_REPLY_EXIT_CODE = 8

# Error returned when `--fail` is used and the HTTP server returns an error
# code that is >= 400.
CURL_HTTP_RETURNED_ERROR_EXIT_CODE = 22

# This regex is used to extract the part of an ETag within quotation marks,
# ignoring any leading weak validator indicator (`W/`). This simplifies
# ETag comparison in `#curl_check_http_content`.
Expand All @@ -26,7 +33,10 @@ module Curl
# the status code and any following descriptive text (e.g. `Not Found`).
HTTP_STATUS_LINE_REGEX = %r{^HTTP/.* (?<code>\d+)(?: (?<text>[^\r\n]+))?}

private_constant :ETAG_VALUE_REGEX, :HTTP_RESPONSE_BODY_SEPARATOR, :HTTP_STATUS_LINE_REGEX
private_constant :CURL_WEIRD_SERVER_REPLY_EXIT_CODE,
:CURL_HTTP_RETURNED_ERROR_EXIT_CODE,
:ETAG_VALUE_REGEX, :HTTP_RESPONSE_BODY_SEPARATOR,
:HTTP_STATUS_LINE_REGEX

module_function

Expand Down Expand Up @@ -222,8 +232,10 @@ def curl_headers(*args, wanted_headers: [], **options)
**options
)

# 22 means a non-successful HTTP status code, not a `curl` error, so we still got some headers.
if result.success? || result.exit_status == 22
# We still receive usable headers with certain non-successful exit
# statuses, so we special case them below.
if result.success? ||
[CURL_WEIRD_SERVER_REPLY_EXIT_CODE, CURL_HTTP_RETURNED_ERROR_EXIT_CODE].include?(result.exit_status)
parsed_output = parse_curl_output(result.stdout)

if request_args.empty?
Expand All @@ -235,7 +247,8 @@ def curl_headers(*args, wanted_headers: [], **options)
next if (400..499).cover?(parsed_output.fetch(:responses).last&.fetch(:status_code).to_i)
end

return parsed_output if result.success?
return parsed_output if result.success? ||
result.exit_status == CURL_WEIRD_SERVER_REPLY_EXIT_CODE
end

result.assert_success!
Expand Down

0 comments on commit b5a8efc

Please sign in to comment.