diff --git a/lib/sidekiq/web.rb b/lib/sidekiq/web.rb index ed454f4b..709e9a76 100644 --- a/lib/sidekiq/web.rb +++ b/lib/sidekiq/web.rb @@ -61,24 +61,18 @@ module Sidekiq secret = Web.session_secret if secret.nil? - # explicitly generating a session secret eagerly to play nice with preforking - begin - require 'securerandom' - secret = SecureRandom.hex(64) - rescue LoadError, NotImplementedError - # SecureRandom raises a NotImplementedError if no random device is available - secret = "%064x" % Kernel.rand(2**256-1) - end + require 'securerandom' + secret = SecureRandom.hex(64) end - @app = Rack::Builder.new do + @app = ::Rack::Builder.new do %w(stylesheets javascripts images).each do |asset_dir| map "/#{asset_dir}" do - run Rack::File.new("#{ASSETS}/#{asset_dir}") + run ::Rack::File.new("#{ASSETS}/#{asset_dir}") end end - use Rack::Session::Cookie, secret: secret + use ::Rack::Session::Cookie, secret: secret use ::Rack::Protection, use: :authenticity_token unless ENV['RACK_ENV'] == 'test' run WebApplication.new @@ -94,6 +88,10 @@ module Sidekiq @app.call(env) end + def self.register(extension) + extension.registered(WebApplication) + end + ERB.new(File.read LAYOUT).def_method(WebAction, '_render') end end diff --git a/lib/sidekiq/web/application.rb b/lib/sidekiq/web/application.rb index 1fff12ac..bc7f2bdc 100644 --- a/lib/sidekiq/web/application.rb +++ b/lib/sidekiq/web/application.rb @@ -42,7 +42,7 @@ module Sidekiq get "/queues/:name" do @name = route_params[:name] - next(not_found(env)) unless @name + next(NOPE) unless @name @count = (params['count'] || 25).to_i @queue = Sidekiq::Queue.new(@name) @@ -74,7 +74,7 @@ module Sidekiq end get "/morgue/:key" do - next not_found(env) unless key = route_params[:key] + next NOPE unless key = route_params[:key] @dead = Sidekiq::DeadSet.new.fetch(*parse_params(key)).first @@ -109,7 +109,7 @@ module Sidekiq end post "/morgue/:key" do - next not_found(env) unless key = route_params[:key] + next NOPE unless key = route_params[:key] job = Sidekiq::DeadSet.new.fetch(*parse_params(key)).first retry_or_delete_or_kill job, params if job @@ -196,7 +196,7 @@ module Sidekiq end post "/scheduled/:key" do - next not_found(env) unless key = route_params[:key] + next NOPE unless key = route_params[:key] job = Sidekiq::ScheduledSet.new.fetch(*parse_params(key)).first delete_or_add_queue job, params if job @@ -232,14 +232,49 @@ module Sidekiq json Sidekiq::Stats::Queues.new.lengths end - def not_found(env) - [404, {}, []] - end + NOPE = [404, {}, []] def call(env) - action = self.class.match(env) || WebAction.new(env, method(:not_found).to_proc) + action = self.class.match(env) + return NOPE unless action - action.instance_exec env, &action.app + self.class.run_befores(env) + resp = action.instance_exec env, &action.app + self.class.run_afters(env) + resp end + + def self.helpers(mod) + WebAction.send(:include, mod) + end + + def self.before(&block) + befores << block + end + + def self.after(&block) + afters << block + end + + def self.run_befores(env) + befores.each do |b| + b.call(env) + end + end + + def self.run_afters(env) + afters.each do |b| + b.call(env) + end + end + + def self.befores + @befores ||= [] + end + + def self.afters + @afters ||= [] + end + end end