Module: Braintrust::Internal::Http

Defined in:
lib/braintrust/internal/http.rb

Overview

HTTP utilities for redirect following and response decompression. Drop-in enhancement for raw Net::HTTP request calls throughout the SDK.

Constant Summary collapse

DEFAULT_MAX_REDIRECTS =
5

Class Method Summary collapse

Class Method Details

.decompress_response!(response) ⇒ void

This method returns an undefined value.

Decompress an HTTP response body in place based on Content-Encoding. No-op if the response has no recognized encoding.

Parameters:

  • response (Net::HTTPResponse)

    The response to decompress



58
59
60
61
62
63
64
65
66
67
# File 'lib/braintrust/internal/http.rb', line 58

def self.decompress_response!(response)
  encoding = response["content-encoding"]&.downcase
  case encoding
  when "gzip", "x-gzip"
    gz = Zlib::GzipReader.new(StringIO.new(response.body))
    response.body.replace(gz.read)
    gz.close
    response.delete("content-encoding")
  end
end

.with_redirects(uri, request, max_redirects: DEFAULT_MAX_REDIRECTS) ⇒ Net::HTTPResponse

Execute an HTTP request, following redirects as needed.

Parameters:

  • uri (URI)

    The request URI

  • request (Net::HTTPRequest)

    The prepared request object

  • max_redirects (Integer) (defaults to: DEFAULT_MAX_REDIRECTS)

    Maximum number of redirects to follow

Returns:

  • (Net::HTTPResponse)

    The final response

Raises:



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/braintrust/internal/http.rb', line 23

def self.with_redirects(uri, request, max_redirects: DEFAULT_MAX_REDIRECTS)
  response = perform_request(uri, request)

  redirects = 0
  original_request = request

  while response.is_a?(Net::HTTPRedirection)
    redirects += 1
    if redirects > max_redirects
      raise Error, "Too many redirects (max #{max_redirects})"
    end

    location = response["location"]
    unless location
      raise Error, "Redirect response #{response.code} without Location header"
    end

    redirect_uri = URI(location)
    redirect_uri = uri + redirect_uri unless redirect_uri.host

    Log.debug("[HTTP] Following #{response.code} redirect to #{redirect_uri}")

    request = build_redirect_request(response, redirect_uri, original_request, uri)
    uri = redirect_uri
    response = perform_request(uri, request)
  end

  response
end