class ReeHttp::ExecuteRequest

def call(request, **opts, &block)

def call(request, **opts, &block)
  opts = DEFAULTS.merge(opts)
  requester = build_request_executor(
    request.uri,
    **slice(opts, [:timeout, :force_ssl, :ca_certs, :proxy, :write_timeout])
  )
  ReeHttp.logger.debug(
    "Sending #{request.method} request: URI #{request.uri}\n BODY: #{request.body}\n"
  )
  response = requester.start do |http|
    http.request(request, &block)
  end
  ReeHttp.logger.debug(
    "Got #{response.code} response on request URI #{request.uri}\n With BODY: #{response.body}\n"
  )
  if response.is_a?(Net::HTTPRedirection)
    return process_redirect_response(response, request, opts, &block)
  end
  response
end

def process_redirect_response(response, request, opts, &block)

def process_redirect_response(response, request, opts, &block)
  if opts[:redirects_count] == 0
    raise TooManyRedirectsError, "Got too match redirects, if you want more redirects, use redirects_count"
  end
  if opts[:strict_redirect_mode] && STRICT_SENSITIVE_CODES.include?(response.code.to_i) && UNSAFE_VERBS.include?(request.method.to_sym)
    raise RedirectMethodError, "Got #{response.code.to_i} with strict_mode"
  end
  if (ALWAYS_GET_CODES.include?(response.code.to_i) || STRICT_SENSITIVE_CODES.include?(response.code.to_i)) && UNSAFE_VERBS.include?(request.method.downcase.to_sym)
    new_request_method = :get
  end
  new_request_method ||= request.method.downcase.to_sym
  new_uri = URI(response['Location'] || response['location'])
  new_request = build_request(
    new_request_method,
    new_uri.to_s,
    **slice(opts, [
        :headers, :body, :form_data, :query_params,
        :force_ssl, :ca_certs, :basic_auth, :bearer_token
    ])
  )
  opts[:redirects_count] -= 1
  call(new_request, **opts, &block)
end