class Anthropic::Internal::Transport::BaseClient

def send_request(request, redirect_count:, retry_count:, send_retry_header:)

Returns:
  • (Array(Integer, Net::HTTPResponse, Enumerable)) -

Raises:
  • (Anthropic::Errors::APIError) -

Parameters:
  • send_retry_header (Boolean) --
  • retry_count (Integer) --
  • redirect_count (Integer) --
  • request (Hash{Symbol=>Object}) -- .

Options Hash: (**request)
  • :timeout (Float) --
  • :max_retries (Integer) --
  • :body (Object) --
  • :headers (Hash{String=>String}) --
  • :url (URI::Generic) --
  • :method (Symbol) --

Other tags:
    Api: - private
def send_request(request, redirect_count:, retry_count:, send_retry_header:)
  request = transform_request(request)
  url, headers, max_retries, timeout = request.fetch_values(:url, :headers, :max_retries, :timeout)
  input = {**request.except(:timeout), deadline: Anthropic::Internal::Util.monotonic_secs + timeout}
  if send_retry_header
    headers["x-stainless-retry-count"] = retry_count.to_s
  end
  begin
    status, response, stream = @requester.execute(input)
  rescue Anthropic::Errors::APIConnectionError => e
    status = e
  end
  case status
  in ..299
    [status, response, stream]
  in 300..399 if redirect_count >= self.class::MAX_REDIRECTS
    self.class.reap_connection!(status, stream: stream)
    message = "Failed to complete the request within #{self.class::MAX_REDIRECTS} redirects."
    raise Anthropic::Errors::APIConnectionError.new(url: url, response: response, message: message)
  in 300..399
    self.class.reap_connection!(status, stream: stream)
    request = self.class.follow_redirect(request, status: status, response_headers: response)
    send_request(
      request,
      redirect_count: redirect_count + 1,
      retry_count: retry_count,
      send_retry_header: send_retry_header
    )
  in Anthropic::Errors::APIConnectionError if retry_count >= max_retries
    raise status
  in (400..) if retry_count >= max_retries || !self.class.should_retry?(status, headers: response)
    decoded = Kernel.then do
      Anthropic::Internal::Util.decode_content(response, stream: stream, suppress_error: true)
    ensure
      self.class.reap_connection!(status, stream: stream)
    end
    raise Anthropic::Errors::APIStatusError.for(
      url: url,
      status: status,
      body: decoded,
      request: nil,
      response: response
    )
  in (400..) | Anthropic::Errors::APIConnectionError
    self.class.reap_connection!(status, stream: stream)
    delay = retry_delay(response || {}, retry_count: retry_count)
    sleep(delay)
    send_request(
      request,
      redirect_count: redirect_count,
      retry_count: retry_count + 1,
      send_retry_header: send_retry_header
    )
  end
end