Class: Sidekiq::WebApplication

Inherits:
Object
  • Object
show all
Extended by:
WebRouter
Defined in:
lib/sidekiq/web/application.rb

Constant Summary collapse

CONTENT_LENGTH =
"Content-Length"
CONTENT_TYPE =
"Content-Type"
REDIS_KEYS =
%w(redis_version uptime_in_days connected_clients used_memory_human used_memory_peak_human)
CSP_HEADER =
[
  "default-src 'self' https: http:",
  "child-src 'self'",
  "connect-src 'self' https: http: wss: ws:",
  "font-src 'self' https: http:",
  "frame-src 'self'",
  "img-src 'self' https: http: data:",
  "manifest-src 'self'",
  "media-src 'self'",
  "object-src 'none'",
  "script-src 'self' https: http: 'unsafe-inline'",
  "style-src 'self' https: http: 'unsafe-inline'",
  "worker-src 'self'",
  "base-uri 'self'"
].join('; ').freeze

Constants included from WebRouter

Sidekiq::WebRouter::DELETE, Sidekiq::WebRouter::GET, Sidekiq::WebRouter::HEAD, Sidekiq::WebRouter::PATCH, Sidekiq::WebRouter::PATH_INFO, Sidekiq::WebRouter::POST, Sidekiq::WebRouter::PUT, Sidekiq::WebRouter::REQUEST_METHOD, Sidekiq::WebRouter::ROUTE_PARAMS

Class Method Summary collapse

Instance Method Summary collapse

Methods included from WebRouter

delete, get, match, patch, post, put, route

Constructor Details

#initialize(klass) ⇒ WebApplication

Returns a new instance of WebApplication.



26
27
28
# File 'lib/sidekiq/web/application.rb', line 26

def initialize(klass)
  @klass = klass
end

Class Method Details

.after(path = nil, &block) ⇒ Object



328
329
330
# File 'lib/sidekiq/web/application.rb', line 328

def self.after(path=nil, &block)
  afters << [path && Regexp.new("\\A#{path.gsub("*", ".*")}\\z"), block]
end

.aftersObject



349
350
351
# File 'lib/sidekiq/web/application.rb', line 349

def self.afters
  @afters ||= []
end

.before(path = nil, &block) ⇒ Object



324
325
326
# File 'lib/sidekiq/web/application.rb', line 324

def self.before(path=nil, &block)
  befores << [path && Regexp.new("\\A#{path.gsub("*", ".*")}\\z"), block]
end

.beforesObject



345
346
347
# File 'lib/sidekiq/web/application.rb', line 345

def self.befores
  @befores ||= []
end

.helpers(mod = nil, &block) ⇒ Object



316
317
318
319
320
321
322
# File 'lib/sidekiq/web/application.rb', line 316

def self.helpers(mod=nil, &block)
  if block_given?
    WebAction.class_eval(&block)
  else
    WebAction.send(:include, mod)
  end
end

.run_afters(app, action) ⇒ Object



336
337
338
# File 'lib/sidekiq/web/application.rb', line 336

def self.run_afters(app, action)
  run_hooks(afters, app, action)
end

.run_befores(app, action) ⇒ Object



332
333
334
# File 'lib/sidekiq/web/application.rb', line 332

def self.run_befores(app, action)
  run_hooks(befores, app, action)
end

.run_hooks(hooks, app, action) ⇒ Object



340
341
342
343
# File 'lib/sidekiq/web/application.rb', line 340

def self.run_hooks(hooks, app, action)
  hooks.select { |p,_| !p || p =~ action.env[WebRouter::PATH_INFO] }.
        each {|_,b| action.instance_exec(action.env, app, &b) }
end

.set(key, val) ⇒ Object



42
43
44
# File 'lib/sidekiq/web/application.rb', line 42

def self.set(key, val)
  # nothing, backwards compatibility
end

.settingsObject



34
35
36
# File 'lib/sidekiq/web/application.rb', line 34

def self.settings
  Sidekiq::Web.settings
end

.tabsObject



38
39
40
# File 'lib/sidekiq/web/application.rb', line 38

def self.tabs
  Sidekiq::Web.tabs
end

Instance Method Details

#call(env) ⇒ Object



279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
# File 'lib/sidekiq/web/application.rb', line 279

def call(env)
  action = self.class.match(env)
  return [404, {"Content-Type" => "text/plain", "X-Cascade" => "pass" }, ["Not Found"]] unless action

  resp = catch(:halt) do
    app = @klass
    self.class.run_befores(app, action)
    begin
      resp = action.instance_exec env, &action.block
    ensure
      self.class.run_afters(app, action)
    end

    resp
  end

  resp = case resp
  when Array
    resp
  else
    headers = {
      "Content-Type" => "text/html",
      "Cache-Control" => "no-cache",
      "Content-Language" => action.locale,
      "Content-Security-Policy" => CSP_HEADER
    }

    [200, headers, [resp]]
  end

  resp[1] = resp[1].dup

  resp[1][CONTENT_LENGTH] = resp[2].inject(0) { |l, p| l + p.bytesize }.to_s

  resp
end

#settingsObject



30
31
32
# File 'lib/sidekiq/web/application.rb', line 30

def settings
  @klass.settings
end