Class: MLB::RedirectHandler

Inherits:
Object
  • Object
show all
Defined in:
lib/mlb/redirect_handler.rb

Overview

Handles HTTP redirects for API requests

Constant Summary collapse

DEFAULT_MAX_REDIRECTS =

Default maximum number of redirects to follow

10
PRESERVE_METHOD_CODES =

HTTP redirect codes that preserve the original method and body

[307, 308].freeze
LOCATION_HEADER =

HTTP header for redirect location

"location".freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(connection: Connection.new, request_builder: RequestBuilder.new, max_redirects: DEFAULT_MAX_REDIRECTS) ⇒ RedirectHandler

Initializes a new RedirectHandler instance

Examples:

handler = MLB::RedirectHandler.new

Parameters:

  • connection (Connection) (defaults to: Connection.new)

    the connection instance

  • request_builder (RequestBuilder) (defaults to: RequestBuilder.new)

    the request builder instance

  • max_redirects (Integer) (defaults to: DEFAULT_MAX_REDIRECTS)

    the maximum number of redirects to follow



57
58
59
60
61
62
# File 'lib/mlb/redirect_handler.rb', line 57

def initialize(connection: Connection.new, request_builder: RequestBuilder.new,
  max_redirects: DEFAULT_MAX_REDIRECTS)
  @connection = connection
  @request_builder = request_builder
  @max_redirects = max_redirects
end

Instance Attribute Details

#connectionConnection (readonly)

Returns the connection instance

Examples:

handler.connection #=> #<MLB::Connection>

Returns:



39
40
41
# File 'lib/mlb/redirect_handler.rb', line 39

def connection
  @connection
end

#max_redirectsInteger

Returns the maximum number of redirects to follow

Examples:

handler.max_redirects #=> 10

Returns:

  • (Integer)

    the maximum redirects



23
24
25
# File 'lib/mlb/redirect_handler.rb', line 23

def max_redirects
  @max_redirects
end

#request_builderRequestBuilder (readonly)

Returns the request builder instance

Examples:

handler.request_builder #=> #<MLB::RequestBuilder>

Returns:



47
48
49
# File 'lib/mlb/redirect_handler.rb', line 47

def request_builder
  @request_builder
end

Instance Method Details

#handle(response:, request:, base_url:, redirect_count: 0) ⇒ Net::HTTPResponse

Handles HTTP redirects

Examples:

handler.handle(response: response, request: request, base_url: "https://example.com")

Parameters:

  • response (Net::HTTPResponse)

    the HTTP response

  • request (Net::HTTPRequest)

    the original HTTP request

  • base_url (String)

    the base URL for relative redirects

  • redirect_count (Integer) (defaults to: 0)

    the current redirect count

Returns:

  • (Net::HTTPResponse)

    the final HTTP response

Raises:



75
76
77
78
79
80
81
82
83
84
# File 'lib/mlb/redirect_handler.rb', line 75

def handle(response:, request:, base_url:, redirect_count: 0)
  return response unless response.is_a?(Net::HTTPRedirection)
  raise TooManyRedirects, "Too many redirects" if redirect_count > max_redirects

  new_uri = build_redirect_uri(response, base_url)
  new_request = build_redirect_request(request, new_uri, Integer(response.code))
  new_response = connection.perform(request: new_request)

  handle(response: new_response, request: new_request, base_url:, redirect_count: redirect_count + 1)
end