redirect_to hook
This commit is contained in:
@@ -88,7 +88,7 @@ Rails.application.configure do # rubocop:disable Metrics/BlockLength
|
||||
end
|
||||
elsif Rails.application.server?
|
||||
config.after_initialize do
|
||||
Semantic::DevLoader.new
|
||||
Semantic::DevLoader.new('toto1')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
+31
-14
@@ -1,14 +1,14 @@
|
||||
module Semantic
|
||||
# use the Zeitwerk autoloader to reattach_appender for development autoreloading feature
|
||||
class DevLoader
|
||||
def initialize
|
||||
@subscribers = []
|
||||
def initialize(session_key)
|
||||
@session_key = session_key
|
||||
|
||||
force_preload_module
|
||||
Rails.autoloaders.main.on_load('ApplicationController') do
|
||||
once_and_reload do
|
||||
append_ansi_formatter
|
||||
register_log_subscriber
|
||||
end
|
||||
append_ansi_formatter
|
||||
|
||||
# FIXME: when final
|
||||
# Rails.logger.level = :error
|
||||
@@ -16,10 +16,13 @@ module Semantic
|
||||
|
||||
private
|
||||
|
||||
def force_preload_module
|
||||
self.class.module_parent.constants.each do |const|
|
||||
self.class.module_parent.const_get(const)
|
||||
def once_and_reload(&)
|
||||
yield
|
||||
Rails.autoloaders.main.on_load('ApplicationController', &)
|
||||
end
|
||||
|
||||
def force_preload_module
|
||||
self.class.module_parent.constants.each { |const| self.class.module_parent.const_get(const) }
|
||||
end
|
||||
|
||||
def append_ansi_formatter
|
||||
@@ -31,16 +34,30 @@ module Semantic
|
||||
end
|
||||
|
||||
def register_log_subscriber
|
||||
reset_subscribers
|
||||
register_to_action_controller(:start_processing)
|
||||
register_to_action_controller(:process_action, :finish_processing)
|
||||
register_to_action_controller(:redirect_to)
|
||||
%i[send_file send_data halted_callback unpermitted_parameters send_stream write_fragment
|
||||
read_fragment expire_fragment exist_fragment?].each do |hook|
|
||||
register_to_action_controller(hook, :any_hook)
|
||||
end
|
||||
end
|
||||
|
||||
def register_to_action_controller(hook, method = hook)
|
||||
@subscribers << ActiveSupport::Notifications.subscribe("#{hook}.action_controller") do |event|
|
||||
@log_subscriber.send(method, event)
|
||||
end
|
||||
end
|
||||
|
||||
def reset_subscribers
|
||||
if defined?(@subscribers)
|
||||
@subscribers.each { |sub| ActiveSupport::Notifications.unsubscribe(sub) }
|
||||
@subscribers.clear
|
||||
|
||||
log_subscriber = Semantic::LogSubscriber.new('toto1')
|
||||
@subscribers << ActiveSupport::Notifications.subscribe('start_processing.action_controller') do |event|
|
||||
log_subscriber.start_processing(event)
|
||||
end
|
||||
@subscribers << ActiveSupport::Notifications.subscribe('process_action.action_controller') do |event|
|
||||
log_subscriber.finish_processing(event)
|
||||
else
|
||||
@subscribers = []
|
||||
end
|
||||
@log_subscriber = Semantic::LogSubscriber.new(@session_key)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -5,6 +5,7 @@ module Semantic
|
||||
# def logger = SemanticLogger['Rails']
|
||||
|
||||
INTERNAL_PARAMS = %i[controller action format _method only_path].freeze
|
||||
DEFAULT_DEV_HOSTS = ['127.0.0.1', 'localhost'].freeze
|
||||
|
||||
def initialize(session_key)
|
||||
@session_key = session_key
|
||||
@@ -38,7 +39,7 @@ module Semantic
|
||||
end
|
||||
|
||||
def finish_processing(event)
|
||||
session_value = @transactions.delete(event.transaction_id) # get previous session_value from start_processing
|
||||
session_value = @transactions.delete(event.transaction_id) # delete previous session_value from start_processing
|
||||
SemanticLogger.tagged(session_value) do
|
||||
payload = event.payload
|
||||
additions = ActionController::Base.log_process_action(payload)
|
||||
@@ -63,8 +64,38 @@ module Semantic
|
||||
end
|
||||
end
|
||||
|
||||
def redirect_to(event)
|
||||
SemanticLogger.tagged(@transactions[event.transaction_id]) do
|
||||
location = capture_path(event.payload[:location])
|
||||
logger.debug("Redirected to #{colorize(location, BOLD)}")
|
||||
end
|
||||
end
|
||||
|
||||
def any_hook(event)
|
||||
SemanticLogger.tagged(@transactions[event.transaction_id]) do
|
||||
logger.warn("action_controller hook=<#{event.name.split('.')[0]}> needs a proper message handling!",
|
||||
event.payload.keys)
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def redirect_regex
|
||||
return @redirect_regex if defined?(@redirect_regex)
|
||||
|
||||
options = Rails.application.routes.default_url_options
|
||||
dev_hosts = DEFAULT_DEV_HOSTS + Array.wrap(options[:host])
|
||||
dev_hosts_or = dev_hosts.uniq.join('|')
|
||||
dev_from = "http://(?:#{dev_hosts_or}):#{options[:port]}(.*)"
|
||||
|
||||
@redirect_regex = /^#{dev_from}/
|
||||
end
|
||||
|
||||
def capture_path(url)
|
||||
m = redirect_regex.match(url)
|
||||
m.nil? ? url : m[1]
|
||||
end
|
||||
|
||||
def session_value(event) = event.payload[:headers]['rack.session'].fetch(@session_key, nil)
|
||||
def process_duration(event, additions) = "Processed in #{event.duration.round}ms (#{additions.join(' | ')})"
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user