class Utopia::Redirection::Errors

A middleware which performs internal redirects based on error status codes.

Public Class Methods

new(app, codes = {}) click to toggle source

@param codes [Hash<Integer,String>] The redirection path for a given error code.

# File lib/utopia/redirection.rb, line 44
def initialize(app, codes = {})
        @app = app
        @codes = codes
end

Public Instance Methods

call(env) click to toggle source
# File lib/utopia/redirection.rb, line 61
def call(env)
        response = @app.call(env)
        
        if unhandled_error?(response) && location = @codes[response[0]]
                error_request = env.merge(Rack::PATH_INFO => location, Rack::REQUEST_METHOD => Rack::GET)
                error_response = @app.call(error_request)

                if error_response[0] >= 400
                        raise RequestFailure.new(env[Rack::PATH_INFO], response[0], location, error_response[0])
                else
                        # Feed the error code back with the error document:
                        error_response[0] = response[0]
                        return error_response
                end
        else
                return response
        end
end
freeze() click to toggle source
Calls superclass method
# File lib/utopia/redirection.rb, line 49
def freeze
        return self if frozen?
        
        @codes.freeze
        
        super
end
unhandled_error?(response) click to toggle source
# File lib/utopia/redirection.rb, line 57
def unhandled_error?(response)
        response[0] >= 400 && response[1].empty?
end