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"
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.



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

def initialize(klass)
  @klass = klass
end

Class Method Details

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



334
335
336
# File 'lib/sidekiq/web/application.rb', line 334

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

.aftersObject



355
356
357
# File 'lib/sidekiq/web/application.rb', line 355

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

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



330
331
332
# File 'lib/sidekiq/web/application.rb', line 330

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

.beforesObject



351
352
353
# File 'lib/sidekiq/web/application.rb', line 351

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

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



322
323
324
325
326
327
328
# File 'lib/sidekiq/web/application.rb', line 322

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



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

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

.run_befores(app, action) ⇒ Object



338
339
340
# File 'lib/sidekiq/web/application.rb', line 338

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

.run_hooks(hooks, app, action) ⇒ Object



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

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



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

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

.settingsObject



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

def self.settings
  Sidekiq::Web.settings
end

.tabsObject



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

def self.tabs
  Sidekiq::Web.tabs
end

Instance Method Details

#call(env) ⇒ Object



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
315
316
317
318
319
320
# File 'lib/sidekiq/web/application.rb', line 289

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

  app = @klass
  resp = catch(:halt) do # rubocop:disable Standard/SemanticBlocks
    self.class.run_befores(app, action)
    action.instance_exec env, &action.block
  ensure
    self.class.run_afters(app, action)
  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].sum(&:bytesize).to_s

  resp
end

#settingsObject



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

def settings
  @klass.settings
end