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:

  • (defaults to: Connection.new)

    the connection instance

  • (defaults to: RequestBuilder.new)

    the request builder instance

  • (defaults to: DEFAULT_MAX_REDIRECTS)

    the maximum number of redirects to follow

API:

  • public



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:

  • the connection instance

API:

  • public



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:

  • the maximum redirects

API:

  • public



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:

  • the request builder instance

API:

  • public



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:

  • the HTTP response

  • the original HTTP request

  • the base URL for relative redirects

  • (defaults to: 0)

    the current redirect count

Returns:

  • the final HTTP response

Raises:

  • if the maximum number of redirects is exceeded

API:

  • public



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