Class: Reaxar::Middleware::Redirect
- Inherits:
-
MiddlewareAbstract
- Object
- MiddlewareAbstract
- Reaxar::Middleware::Redirect
- Defined in:
- lib/reaxar/middleware/redirect.rb
Overview
Middleware for handling HTTP redirects.
Constant Summary collapse
- MAX_REDIRECTS =
The maximum number of allowed redirects.
5
Instance Attribute Summary collapse
-
#redirect_count ⇒ Integer
readonly
The number of redirects for the request.
Instance Method Summary collapse
-
#initialize ⇒ Redirect
constructor
Initializes the Redirect middleware.
-
#process_request(request) ⇒ Hash
Initializes the redirect counter for the request.
-
#process_response(response, request) ⇒ Object, Symbol
Processes the HTTP response and handles redirects if needed.
Constructor Details
#initialize ⇒ Redirect
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_count ⇒ Integer (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 |