class ProxES::Middleware::ErrorHandling
Attributes
logger[R]
Public Class Methods
new(app, logger = nil)
click to toggle source
# File lib/proxes/middleware/error_handling.rb, line 14 def initialize(app, logger = nil) @app = app @logger = logger || ::Ditty::Services::Logger end
Public Instance Methods
call(env)
click to toggle source
# File lib/proxes/middleware/error_handling.rb, line 19 def call(env) request = ProxES::Request.from_env(env) response = @app.call env broadcast(:es_request_failed, request, response) unless (200..299).cover?(response[0]) response rescue Errno::EHOSTUNREACH error 'Could not reach Elasticsearch at ' + ENV['ELASTICSEARCH_URL'] rescue Errno::ECONNREFUSED, Faraday::ConnectionFailed, SocketError error 'Elasticsearch not listening at ' + ENV['ELASTICSEARCH_URL'] rescue Pundit::NotAuthorizedError, Ditty::Helpers::NotAuthenticated => e broadcast(:es_request_denied, request, e) log_not_authorized request raise e if ENV['APP_ENV'] == 'development' return [401, {}, []] if request.head? request.html? && request.user.nil? ? login_and_redirect(request) : error('Not Authorized', 401) rescue StandardError => e broadcast(:es_request_denied, request, e) log_not_authorized request raise e if ENV['APP_ENV'] == 'development' return [403, {}. []] if request.head? error 'Forbidden', 403 end
error(message, code = 500)
click to toggle source
Response Helpers
# File lib/proxes/middleware/error_handling.rb, line 50 def error(message, code = 500) headers = { 'Content-Type' => 'application/json' } headers['WWW-Authenticate'] = 'Basic realm="Authorization Required"' if code == 401 [code, headers, ['{"error":"' + message + '"}']] end
login_and_redirect(request)
click to toggle source
# File lib/proxes/middleware/error_handling.rb, line 56 def login_and_redirect(request) request.session['omniauth.origin'] = request.url unless request.url == '/_proxes/auth/login' redirect '/_proxes/auth/login' end
redirect(destination, code = 302)
click to toggle source
# File lib/proxes/middleware/error_handling.rb, line 61 def redirect(destination, code = 302) [code, { 'Location' => destination }, []] end