Class: X::RedirectHandler

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

Overview

Handles HTTP redirects for API requests

Constant Summary collapse

DEFAULT_MAX_REDIRECTS =

Default maximum number of redirects to follow

10

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

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

Initialize a new RedirectHandler

Examples:

Create a redirect handler

handler = X::RedirectHandler.new(connection: conn, request_builder: builder)

Parameters:

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

    the connection for making requests

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

    the request builder for creating requests

  • max_redirects (Integer) (defaults to: DEFAULT_MAX_REDIRECTS)

    the maximum number of redirects to follow



45
46
47
48
49
50
# File 'lib/x/redirect_handler.rb', line 45

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)

The connection for making requests

Examples:

Get the connection

handler.connection

Returns:

  • (Connection)

    the connection for making requests



27
28
29
# File 'lib/x/redirect_handler.rb', line 27

def connection
  @connection
end

#max_redirectsInteger

The maximum number of redirects to follow

Examples:

Get or set the maximum redirects

handler.max_redirects = 5

Returns:

  • (Integer)

    the maximum number of redirects to follow



20
21
22
# File 'lib/x/redirect_handler.rb', line 20

def max_redirects
  @max_redirects
end

#request_builderRequestBuilder (readonly)

The request builder for creating requests

Examples:

Get the request builder

handler.request_builder

Returns:



34
35
36
# File 'lib/x/redirect_handler.rb', line 34

def request_builder
  @request_builder
end

Instance Method Details

#handle(response:, request:, base_url:, authenticator: Authenticator.new, redirect_count: 0) ⇒ Net::HTTPResponse

Handle redirects for an HTTP response

Examples:

Handle a response

response = handler.handle(response: resp, request: req, base_url: url)

Parameters:

  • response (Net::HTTPResponse)

    the HTTP response to handle

  • request (Net::HTTPRequest)

    the original HTTP request

  • base_url (String)

    the base URL for the request

  • authenticator (Authenticator) (defaults to: Authenticator.new)

    the authenticator for requests

  • redirect_count (Integer) (defaults to: 0)

    the current redirect count

Returns:

  • (Net::HTTPResponse)

    the final HTTP response after following redirects

Raises:



64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/x/redirect_handler.rb', line 64

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

    new_uri = build_new_uri(response, base_url)

    new_request = build_request(request, new_uri, Integer(response.code), authenticator)
    new_response = connection.perform(request: new_request)

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