Class: Reaxar::Middleware::Redirect

Inherits:
MiddlewareAbstract show all
Defined in:
lib/reaxar/middleware/redirect.rb

Overview

Middleware for handling HTTP redirects.

Examples:

middleware = Reaxar::Middleware::Redirect.new

Constant Summary collapse

MAX_REDIRECTS =

The maximum number of allowed redirects.

5

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeRedirect

Initializes the Redirect middleware.



19
20
21
22
# File 'lib/reaxar/middleware/redirect.rb', line 19

def initialize
  super
  @redirect_count = 0
end

Instance Attribute Details

#redirect_countInteger (readonly)



14
15
16
17
18
19
20
21
22
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
52
53
54
55
56
57
58
59
60
61
# File 'lib/reaxar/middleware/redirect.rb', line 14

class Redirect < MiddlewareAbstract
  # The maximum number of allowed redirects.
  MAX_REDIRECTS = 5

  # Initializes the Redirect middleware.
  def initialize
    super
    @redirect_count = 0
  end

  # Initializes the redirect counter for the request.
  # @param request [Hash] The request data.
  # @return [Hash] The modified request.
  def process_request(request)
    request[:redirect_count] ||= 0
    request
  end

  # Processes the HTTP response and handles redirects if needed.
  # @param response [Object] The HTTP response.
  # @param request [Hash] The original request.
  # @return [Object, Symbol] The response or :retry_request for another attempt.
  def process_response(response, request)
    return response unless response.headers['location']
    return response if request[:redirect_count] >= MAX_REDIRECTS

    request[:redirect_count] += 1

    redirect_uri = process_location_url(request, response)

    request[:uri] = redirect_uri
    request[:method] = :get if [301, 302].include?(response.status)

    :retry_request
  end

  private

  def process_location_url(request, response)
    location = response.headers['location']
    base_uri = URI(request[:uri])
    if location.start_with?('http')
      location
    else
      "#{base_uri.scheme}://#{base_uri.host}#{location}"
    end
  end
end

Instance Method Details

#process_request(request) ⇒ Hash

Initializes the redirect counter for the request.



27
28
29
30
# File 'lib/reaxar/middleware/redirect.rb', line 27

def process_request(request)
  request[:redirect_count] ||= 0
  request
end

#process_response(response, request) ⇒ Object, Symbol

Processes the HTTP response and handles redirects if needed.



36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/reaxar/middleware/redirect.rb', line 36

def process_response(response, request)
  return response unless response.headers['location']
  return response if request[:redirect_count] >= MAX_REDIRECTS

  request[:redirect_count] += 1

  redirect_uri = process_location_url(request, response)

  request[:uri] = redirect_uri
  request[:method] = :get if [301, 302].include?(response.status)

  :retry_request
end