sidekiq 5.2.1 → 6.0.7
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of sidekiq might be problematic. Click here for more details.
- checksums.yaml +5 -5
- data/.circleci/config.yml +60 -0
- data/.gitignore +1 -1
- data/.standard.yml +20 -0
- data/6.0-Upgrade.md +72 -0
- data/COMM-LICENSE +11 -9
- data/Changes.md +209 -0
- data/Ent-2.0-Upgrade.md +37 -0
- data/Ent-Changes.md +36 -1
- data/Gemfile +19 -9
- data/Gemfile.lock +208 -0
- data/Pro-5.0-Upgrade.md +25 -0
- data/Pro-Changes.md +44 -1
- data/README.md +19 -31
- data/Rakefile +6 -4
- data/bin/sidekiq +19 -0
- data/bin/sidekiqload +33 -25
- data/bin/sidekiqmon +8 -0
- data/lib/generators/sidekiq/templates/worker_test.rb.erb +1 -1
- data/lib/generators/sidekiq/worker_generator.rb +21 -13
- data/lib/sidekiq/api.rb +240 -214
- data/lib/sidekiq/cli.rb +167 -219
- data/lib/sidekiq/client.rb +61 -46
- data/lib/sidekiq/delay.rb +5 -6
- data/lib/sidekiq/exception_handler.rb +10 -12
- data/lib/sidekiq/extensions/action_mailer.rb +10 -20
- data/lib/sidekiq/extensions/active_record.rb +9 -7
- data/lib/sidekiq/extensions/class_methods.rb +9 -7
- data/lib/sidekiq/extensions/generic_proxy.rb +4 -4
- data/lib/sidekiq/fetch.rb +11 -12
- data/lib/sidekiq/job_logger.rb +47 -9
- data/lib/sidekiq/job_retry.rb +79 -58
- data/lib/sidekiq/launcher.rb +86 -54
- data/lib/sidekiq/logger.rb +165 -0
- data/lib/sidekiq/manager.rb +10 -12
- data/lib/sidekiq/middleware/chain.rb +14 -4
- data/lib/sidekiq/middleware/i18n.rb +5 -7
- data/lib/sidekiq/monitor.rb +133 -0
- data/lib/sidekiq/paginator.rb +18 -14
- data/lib/sidekiq/processor.rb +113 -79
- data/lib/sidekiq/rails.rb +24 -29
- data/lib/sidekiq/redis_connection.rb +42 -24
- data/lib/sidekiq/scheduled.rb +28 -29
- data/lib/sidekiq/sd_notify.rb +149 -0
- data/lib/sidekiq/systemd.rb +24 -0
- data/lib/sidekiq/testing/inline.rb +2 -1
- data/lib/sidekiq/testing.rb +34 -23
- data/lib/sidekiq/util.rb +17 -16
- data/lib/sidekiq/version.rb +2 -1
- data/lib/sidekiq/web/action.rb +14 -10
- data/lib/sidekiq/web/application.rb +79 -69
- data/lib/sidekiq/web/helpers.rb +89 -71
- data/lib/sidekiq/web/router.rb +17 -16
- data/lib/sidekiq/web.rb +41 -49
- data/lib/sidekiq/worker.rb +134 -91
- data/lib/sidekiq.rb +69 -44
- data/sidekiq.gemspec +16 -18
- data/web/assets/javascripts/application.js +22 -19
- data/web/assets/javascripts/dashboard.js +16 -25
- data/web/assets/stylesheets/application-dark.css +122 -0
- data/web/assets/stylesheets/application.css +44 -2
- data/web/assets/stylesheets/bootstrap.css +1 -1
- data/web/locales/ar.yml +1 -0
- data/web/locales/de.yml +14 -2
- data/web/locales/en.yml +3 -0
- data/web/locales/fr.yml +2 -2
- data/web/locales/ja.yml +4 -1
- data/web/locales/lt.yml +83 -0
- data/web/locales/vi.yml +83 -0
- data/web/views/_job_info.erb +2 -1
- data/web/views/_nav.erb +3 -17
- data/web/views/busy.erb +4 -1
- data/web/views/dead.erb +2 -2
- data/web/views/layout.erb +1 -0
- data/web/views/morgue.erb +4 -1
- data/web/views/queue.erb +11 -1
- data/web/views/queues.erb +9 -1
- data/web/views/retries.erb +8 -1
- data/web/views/retry.erb +2 -2
- data/web/views/scheduled.erb +4 -1
- metadata +37 -27
- data/.travis.yml +0 -14
- data/bin/sidekiqctl +0 -99
- data/lib/sidekiq/core_ext.rb +0 -1
- data/lib/sidekiq/logging.rb +0 -122
- data/lib/sidekiq/middleware/server/active_record.rb +0 -23
data/lib/sidekiq/web/helpers.rb
CHANGED
@@ -1,15 +1,16 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
2
|
+
|
3
|
+
require "uri"
|
4
|
+
require "set"
|
5
|
+
require "yaml"
|
6
|
+
require "cgi"
|
6
7
|
|
7
8
|
module Sidekiq
|
8
9
|
# This is not a public API
|
9
10
|
module WebHelpers
|
10
11
|
def strings(lang)
|
11
|
-
|
12
|
-
|
12
|
+
@strings ||= {}
|
13
|
+
@strings[lang] ||= begin
|
13
14
|
# Allow sidekiq-web extensions to add locale paths
|
14
15
|
# so extensions can be localized
|
15
16
|
settings.locales.each_with_object({}) do |path, global|
|
@@ -22,19 +23,19 @@ module Sidekiq
|
|
22
23
|
end
|
23
24
|
|
24
25
|
def clear_caches
|
25
|
-
|
26
|
-
|
27
|
-
|
26
|
+
@strings = nil
|
27
|
+
@locale_files = nil
|
28
|
+
@available_locales = nil
|
28
29
|
end
|
29
30
|
|
30
31
|
def locale_files
|
31
|
-
|
32
|
+
@locale_files ||= settings.locales.flat_map { |path|
|
32
33
|
Dir["#{path}/*.yml"]
|
33
|
-
|
34
|
+
}
|
34
35
|
end
|
35
36
|
|
36
37
|
def available_locales
|
37
|
-
|
38
|
+
@available_locales ||= locale_files.map { |path| File.basename(path, ".yml") }.uniq
|
38
39
|
end
|
39
40
|
|
40
41
|
def find_locale_files(lang)
|
@@ -63,32 +64,35 @@ module Sidekiq
|
|
63
64
|
end
|
64
65
|
|
65
66
|
def poll_path
|
66
|
-
if current_path !=
|
67
|
-
root_path + current_path
|
67
|
+
if current_path != "" && params["poll"]
|
68
|
+
path = root_path + current_path
|
69
|
+
query_string = to_query_string(params.slice(*params.keys - %w[page poll]))
|
70
|
+
path += "?#{query_string}" unless query_string.empty?
|
71
|
+
path
|
68
72
|
else
|
69
73
|
""
|
70
74
|
end
|
71
75
|
end
|
72
76
|
|
73
77
|
def text_direction
|
74
|
-
get_locale[
|
78
|
+
get_locale["TextDirection"] || "ltr"
|
75
79
|
end
|
76
80
|
|
77
81
|
def rtl?
|
78
|
-
text_direction ==
|
82
|
+
text_direction == "rtl"
|
79
83
|
end
|
80
84
|
|
81
85
|
# See https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4
|
82
86
|
def user_preferred_languages
|
83
|
-
languages = env[
|
84
|
-
languages.to_s.downcase.gsub(/\s+/,
|
85
|
-
locale, quality = language.split(
|
86
|
-
locale
|
87
|
+
languages = env["HTTP_ACCEPT_LANGUAGE"]
|
88
|
+
languages.to_s.downcase.gsub(/\s+/, "").split(",").map { |language|
|
89
|
+
locale, quality = language.split(";q=", 2)
|
90
|
+
locale = nil if locale == "*" # Ignore wildcards
|
87
91
|
quality = quality ? quality.to_f : 1.0
|
88
92
|
[locale, quality]
|
89
|
-
|
93
|
+
}.sort { |(_, left), (_, right)|
|
90
94
|
right <=> left
|
91
|
-
|
95
|
+
}.map(&:first).compact
|
92
96
|
end
|
93
97
|
|
94
98
|
# Given an Accept-Language header like "fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4,ru;q=0.2"
|
@@ -97,31 +101,38 @@ module Sidekiq
|
|
97
101
|
# Inspiration taken from https://github.com/iain/http_accept_language/blob/master/lib/http_accept_language/parser.rb
|
98
102
|
def locale
|
99
103
|
@locale ||= begin
|
100
|
-
matched_locale = user_preferred_languages.map
|
101
|
-
preferred_language = preferred.split(
|
104
|
+
matched_locale = user_preferred_languages.map { |preferred|
|
105
|
+
preferred_language = preferred.split("-", 2).first
|
102
106
|
|
103
|
-
lang_group = available_locales.select
|
104
|
-
preferred_language == available.split(
|
105
|
-
|
107
|
+
lang_group = available_locales.select { |available|
|
108
|
+
preferred_language == available.split("-", 2).first
|
109
|
+
}
|
106
110
|
|
107
111
|
lang_group.find { |lang| lang == preferred } || lang_group.min_by(&:length)
|
108
|
-
|
112
|
+
}.compact.first
|
109
113
|
|
110
|
-
matched_locale ||
|
114
|
+
matched_locale || "en"
|
111
115
|
end
|
112
116
|
end
|
113
117
|
|
118
|
+
# within is used by Sidekiq Pro
|
119
|
+
def display_tags(job, within = nil)
|
120
|
+
job.tags.map { |tag|
|
121
|
+
"<span class='jobtag label label-info'>#{::Rack::Utils.escape_html(tag)}</span>"
|
122
|
+
}.join(" ")
|
123
|
+
end
|
124
|
+
|
114
125
|
# mperham/sidekiq#3243
|
115
126
|
def unfiltered?
|
116
|
-
yield unless env[
|
127
|
+
yield unless env["PATH_INFO"].start_with?("/filter/")
|
117
128
|
end
|
118
129
|
|
119
130
|
def get_locale
|
120
131
|
strings(locale)
|
121
132
|
end
|
122
133
|
|
123
|
-
def t(msg, options={})
|
124
|
-
string = get_locale[msg] || msg
|
134
|
+
def t(msg, options = {})
|
135
|
+
string = get_locale[msg] || strings("en")[msg] || msg
|
125
136
|
if options.empty?
|
126
137
|
string
|
127
138
|
else
|
@@ -129,6 +140,10 @@ module Sidekiq
|
|
129
140
|
end
|
130
141
|
end
|
131
142
|
|
143
|
+
def sort_direction_label
|
144
|
+
params[:direction] == "asc" ? "↑" : "↓"
|
145
|
+
end
|
146
|
+
|
132
147
|
def workers
|
133
148
|
@workers ||= Sidekiq::Workers.new
|
134
149
|
end
|
@@ -141,12 +156,6 @@ module Sidekiq
|
|
141
156
|
@stats ||= Sidekiq::Stats.new
|
142
157
|
end
|
143
158
|
|
144
|
-
def retries_with_score(score)
|
145
|
-
Sidekiq.redis do |conn|
|
146
|
-
conn.zrangebyscore('retry', score, score)
|
147
|
-
end.map { |msg| Sidekiq.load_json(msg) }
|
148
|
-
end
|
149
|
-
|
150
159
|
def redis_connection
|
151
160
|
Sidekiq.redis do |conn|
|
152
161
|
c = conn.connection
|
@@ -163,24 +172,24 @@ module Sidekiq
|
|
163
172
|
end
|
164
173
|
|
165
174
|
def root_path
|
166
|
-
"#{env[
|
175
|
+
"#{env["SCRIPT_NAME"]}/"
|
167
176
|
end
|
168
177
|
|
169
178
|
def current_path
|
170
|
-
@current_path ||= request.path_info.gsub(/^\//,
|
179
|
+
@current_path ||= request.path_info.gsub(/^\//, "")
|
171
180
|
end
|
172
181
|
|
173
182
|
def current_status
|
174
|
-
workers.size == 0 ?
|
183
|
+
workers.size == 0 ? "idle" : "active"
|
175
184
|
end
|
176
185
|
|
177
186
|
def relative_time(time)
|
178
187
|
stamp = time.getutc.iso8601
|
179
|
-
%
|
188
|
+
%(<time class="ltr" dir="ltr" title="#{stamp}" datetime="#{stamp}">#{time}</time>)
|
180
189
|
end
|
181
190
|
|
182
191
|
def job_params(job, score)
|
183
|
-
"#{score}-#{job[
|
192
|
+
"#{score}-#{job["jid"]}"
|
184
193
|
end
|
185
194
|
|
186
195
|
def parse_params(params)
|
@@ -188,7 +197,7 @@ module Sidekiq
|
|
188
197
|
[score.to_f, jid]
|
189
198
|
end
|
190
199
|
|
191
|
-
SAFE_QPARAMS = %w
|
200
|
+
SAFE_QPARAMS = %w[page poll direction]
|
192
201
|
|
193
202
|
# Merge options with current params, filter safe params, and stringify to query string
|
194
203
|
def qparams(options)
|
@@ -197,9 +206,13 @@ module Sidekiq
|
|
197
206
|
options[key.to_s] = options.delete(key)
|
198
207
|
end
|
199
208
|
|
200
|
-
params.merge(options)
|
209
|
+
to_query_string(params.merge(options))
|
210
|
+
end
|
211
|
+
|
212
|
+
def to_query_string(params)
|
213
|
+
params.map { |key, value|
|
201
214
|
SAFE_QPARAMS.include?(key) ? "#{key}=#{CGI.escape(value.to_s)}" : next
|
202
|
-
|
215
|
+
}.compact.join("&")
|
203
216
|
end
|
204
217
|
|
205
218
|
def truncate(text, truncate_after_chars = 2000)
|
@@ -207,9 +220,16 @@ module Sidekiq
|
|
207
220
|
end
|
208
221
|
|
209
222
|
def display_args(args, truncate_after_chars = 2000)
|
210
|
-
args
|
211
|
-
|
212
|
-
|
223
|
+
return "Invalid job payload, args is nil" if args.nil?
|
224
|
+
return "Invalid job payload, args must be an Array, not #{args.class.name}" unless args.is_a?(Array)
|
225
|
+
|
226
|
+
begin
|
227
|
+
args.map { |arg|
|
228
|
+
h(truncate(to_display(arg), truncate_after_chars))
|
229
|
+
}.join(", ")
|
230
|
+
rescue
|
231
|
+
"Illegal job arguments: #{h args.inspect}"
|
232
|
+
end
|
213
233
|
end
|
214
234
|
|
215
235
|
def csrf_tag
|
@@ -217,23 +237,21 @@ module Sidekiq
|
|
217
237
|
end
|
218
238
|
|
219
239
|
def to_display(arg)
|
240
|
+
arg.inspect
|
241
|
+
rescue
|
220
242
|
begin
|
221
|
-
arg.
|
222
|
-
rescue
|
223
|
-
|
224
|
-
arg.to_s
|
225
|
-
rescue => ex
|
226
|
-
"Cannot display argument: [#{ex.class.name}] #{ex.message}"
|
227
|
-
end
|
243
|
+
arg.to_s
|
244
|
+
rescue => ex
|
245
|
+
"Cannot display argument: [#{ex.class.name}] #{ex.message}"
|
228
246
|
end
|
229
247
|
end
|
230
248
|
|
231
|
-
RETRY_JOB_KEYS = Set.new(%w
|
249
|
+
RETRY_JOB_KEYS = Set.new(%w[
|
232
250
|
queue class args retry_count retried_at failed_at
|
233
251
|
jid error_message error_class backtrace
|
234
252
|
error_backtrace enqueued_at retry wrapped
|
235
|
-
created_at
|
236
|
-
)
|
253
|
+
created_at tags
|
254
|
+
])
|
237
255
|
|
238
256
|
def retry_extra_items(retry_job)
|
239
257
|
@retry_extra_items ||= {}.tap do |extra|
|
@@ -250,8 +268,8 @@ module Sidekiq
|
|
250
268
|
return number
|
251
269
|
end
|
252
270
|
|
253
|
-
options = {delimiter:
|
254
|
-
parts = number.to_s.to_str.split(
|
271
|
+
options = {delimiter: ",", separator: "."}
|
272
|
+
parts = number.to_s.to_str.split(".")
|
255
273
|
parts[0].gsub!(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1#{options[:delimiter]}")
|
256
274
|
parts.join(options[:separator])
|
257
275
|
end
|
@@ -259,8 +277,8 @@ module Sidekiq
|
|
259
277
|
def h(text)
|
260
278
|
::Rack::Utils.escape_html(text)
|
261
279
|
rescue ArgumentError => e
|
262
|
-
raise unless e.message.eql?(
|
263
|
-
text.encode!(
|
280
|
+
raise unless e.message.eql?("invalid byte sequence in UTF-8")
|
281
|
+
text.encode!("UTF-16", "UTF-8", invalid: :replace, replace: "").encode!("UTF-8", "UTF-16")
|
264
282
|
retry
|
265
283
|
end
|
266
284
|
|
@@ -277,7 +295,7 @@ module Sidekiq
|
|
277
295
|
end
|
278
296
|
|
279
297
|
def environment_title_prefix
|
280
|
-
environment = Sidekiq.options[:environment] || ENV[
|
298
|
+
environment = Sidekiq.options[:environment] || ENV["APP_ENV"] || ENV["RAILS_ENV"] || ENV["RACK_ENV"] || "development"
|
281
299
|
|
282
300
|
"[#{environment.upcase}] " unless environment == "production"
|
283
301
|
end
|
@@ -287,30 +305,30 @@ module Sidekiq
|
|
287
305
|
end
|
288
306
|
|
289
307
|
def server_utc_time
|
290
|
-
Time.now.utc.strftime(
|
308
|
+
Time.now.utc.strftime("%H:%M:%S UTC")
|
291
309
|
end
|
292
310
|
|
293
311
|
def redis_connection_and_namespace
|
294
312
|
@redis_connection_and_namespace ||= begin
|
295
|
-
namespace_suffix = namespace
|
313
|
+
namespace_suffix = namespace.nil? ? "" : "##{namespace}"
|
296
314
|
"#{redis_connection}#{namespace_suffix}"
|
297
315
|
end
|
298
316
|
end
|
299
317
|
|
300
318
|
def retry_or_delete_or_kill(job, params)
|
301
|
-
if params[
|
319
|
+
if params["retry"]
|
302
320
|
job.retry
|
303
|
-
elsif params[
|
321
|
+
elsif params["delete"]
|
304
322
|
job.delete
|
305
|
-
elsif params[
|
323
|
+
elsif params["kill"]
|
306
324
|
job.kill
|
307
325
|
end
|
308
326
|
end
|
309
327
|
|
310
328
|
def delete_or_add_queue(job, params)
|
311
|
-
if params[
|
329
|
+
if params["delete"]
|
312
330
|
job.delete
|
313
|
-
elsif params[
|
331
|
+
elsif params["add_to_queue"]
|
314
332
|
job.add_to_queue
|
315
333
|
end
|
316
334
|
end
|
data/lib/sidekiq/web/router.rb
CHANGED
@@ -1,18 +1,19 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
|
2
|
+
|
3
|
+
require "rack"
|
3
4
|
|
4
5
|
module Sidekiq
|
5
6
|
module WebRouter
|
6
|
-
GET =
|
7
|
-
DELETE =
|
8
|
-
POST =
|
9
|
-
PUT =
|
10
|
-
PATCH =
|
11
|
-
HEAD =
|
7
|
+
GET = "GET"
|
8
|
+
DELETE = "DELETE"
|
9
|
+
POST = "POST"
|
10
|
+
PUT = "PUT"
|
11
|
+
PATCH = "PATCH"
|
12
|
+
HEAD = "HEAD"
|
12
13
|
|
13
|
-
ROUTE_PARAMS =
|
14
|
-
REQUEST_METHOD =
|
15
|
-
PATH_INFO =
|
14
|
+
ROUTE_PARAMS = "rack.route_params"
|
15
|
+
REQUEST_METHOD = "REQUEST_METHOD"
|
16
|
+
PATH_INFO = "PATH_INFO"
|
16
17
|
|
17
18
|
def get(path, &block)
|
18
19
|
route(GET, path, &block)
|
@@ -35,7 +36,7 @@ module Sidekiq
|
|
35
36
|
end
|
36
37
|
|
37
38
|
def route(method, path, &block)
|
38
|
-
@routes ||= {
|
39
|
+
@routes ||= {GET => [], POST => [], PUT => [], PATCH => [], DELETE => [], HEAD => []}
|
39
40
|
|
40
41
|
@routes[method] << WebRoute.new(method, path, block)
|
41
42
|
@routes[HEAD] << WebRoute.new(method, path, block) if method == GET
|
@@ -50,7 +51,8 @@ module Sidekiq
|
|
50
51
|
path_info = "/" if path_info == ""
|
51
52
|
|
52
53
|
@routes[request_method].each do |route|
|
53
|
-
|
54
|
+
params = route.match(request_method, path_info)
|
55
|
+
if params
|
54
56
|
env[ROUTE_PARAMS] = params
|
55
57
|
|
56
58
|
return WebAction.new(env, route.block)
|
@@ -77,7 +79,7 @@ module Sidekiq
|
|
77
79
|
end
|
78
80
|
|
79
81
|
def compile
|
80
|
-
if pattern.match(NAMED_SEGMENTS_PATTERN)
|
82
|
+
if pattern.match?(NAMED_SEGMENTS_PATTERN)
|
81
83
|
p = pattern.gsub(NAMED_SEGMENTS_PATTERN, '/\1(?<\2>[^$/]+)')
|
82
84
|
|
83
85
|
Regexp.new("\\A#{p}\\Z")
|
@@ -91,9 +93,8 @@ module Sidekiq
|
|
91
93
|
when String
|
92
94
|
{} if path == matcher
|
93
95
|
else
|
94
|
-
|
95
|
-
|
96
|
-
end
|
96
|
+
path_match = path.match(matcher)
|
97
|
+
path_match&.named_captures&.transform_keys(&:to_sym)
|
97
98
|
end
|
98
99
|
end
|
99
100
|
end
|
data/lib/sidekiq/web.rb
CHANGED
@@ -1,20 +1,21 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
require 'erb'
|
3
2
|
|
4
|
-
require
|
5
|
-
require 'sidekiq/api'
|
6
|
-
require 'sidekiq/paginator'
|
7
|
-
require 'sidekiq/web/helpers'
|
3
|
+
require "erb"
|
8
4
|
|
9
|
-
require
|
10
|
-
require
|
11
|
-
require
|
5
|
+
require "sidekiq"
|
6
|
+
require "sidekiq/api"
|
7
|
+
require "sidekiq/paginator"
|
8
|
+
require "sidekiq/web/helpers"
|
12
9
|
|
13
|
-
require
|
10
|
+
require "sidekiq/web/router"
|
11
|
+
require "sidekiq/web/action"
|
12
|
+
require "sidekiq/web/application"
|
14
13
|
|
15
|
-
require
|
16
|
-
|
17
|
-
require
|
14
|
+
require "rack/protection"
|
15
|
+
|
16
|
+
require "rack/builder"
|
17
|
+
require "rack/file"
|
18
|
+
require "rack/session/cookie"
|
18
19
|
|
19
20
|
module Sidekiq
|
20
21
|
class Web
|
@@ -25,12 +26,12 @@ module Sidekiq
|
|
25
26
|
ASSETS = "#{ROOT}/assets"
|
26
27
|
|
27
28
|
DEFAULT_TABS = {
|
28
|
-
"Dashboard" =>
|
29
|
-
"Busy"
|
30
|
-
"Queues"
|
31
|
-
"Retries"
|
32
|
-
"Scheduled" =>
|
33
|
-
"Dead"
|
29
|
+
"Dashboard" => "",
|
30
|
+
"Busy" => "busy",
|
31
|
+
"Queues" => "queues",
|
32
|
+
"Retries" => "retries",
|
33
|
+
"Scheduled" => "scheduled",
|
34
|
+
"Dead" => "morgue"
|
34
35
|
}
|
35
36
|
|
36
37
|
class << self
|
@@ -64,11 +65,11 @@ module Sidekiq
|
|
64
65
|
end
|
65
66
|
|
66
67
|
def enable(*opts)
|
67
|
-
opts.each {|key| set(key, true) }
|
68
|
+
opts.each { |key| set(key, true) }
|
68
69
|
end
|
69
70
|
|
70
71
|
def disable(*opts)
|
71
|
-
opts.each {|key| set(key, false) }
|
72
|
+
opts.each { |key| set(key, false) }
|
72
73
|
end
|
73
74
|
|
74
75
|
# Helper for the Sinatra syntax: Sidekiq::Web.set(:session_secret, Rails.application.secrets...)
|
@@ -81,10 +82,10 @@ module Sidekiq
|
|
81
82
|
end
|
82
83
|
|
83
84
|
def self.inherited(child)
|
84
|
-
child.app_url =
|
85
|
-
child.session_secret =
|
86
|
-
child.redis_pool =
|
87
|
-
child.sessions =
|
85
|
+
child.app_url = app_url
|
86
|
+
child.session_secret = session_secret
|
87
|
+
child.redis_pool = redis_pool
|
88
|
+
child.sessions = sessions
|
88
89
|
end
|
89
90
|
|
90
91
|
def settings
|
@@ -113,11 +114,11 @@ module Sidekiq
|
|
113
114
|
end
|
114
115
|
|
115
116
|
def enable(*opts)
|
116
|
-
opts.each {|key| set(key, true) }
|
117
|
+
opts.each { |key| set(key, true) }
|
117
118
|
end
|
118
119
|
|
119
120
|
def disable(*opts)
|
120
|
-
opts.each {|key| set(key, false) }
|
121
|
+
opts.each { |key| set(key, false) }
|
121
122
|
end
|
122
123
|
|
123
124
|
def set(attribute, value)
|
@@ -145,28 +146,28 @@ module Sidekiq
|
|
145
146
|
private
|
146
147
|
|
147
148
|
def using?(middleware)
|
148
|
-
middlewares.any? do |(m,_)|
|
149
|
-
m.
|
149
|
+
middlewares.any? do |(m, _)|
|
150
|
+
m.is_a?(Array) && (m[0] == middleware || m[0].is_a?(middleware))
|
150
151
|
end
|
151
152
|
end
|
152
153
|
|
153
154
|
def build_sessions
|
154
155
|
middlewares = self.middlewares
|
155
156
|
|
156
|
-
unless using?(::Rack::Protection) || ENV[
|
157
|
-
middlewares.unshift [[::Rack::Protection, {
|
157
|
+
unless using?(::Rack::Protection) || ENV["RACK_ENV"] == "test"
|
158
|
+
middlewares.unshift [[::Rack::Protection, {use: :authenticity_token}], nil]
|
158
159
|
end
|
159
160
|
|
160
161
|
s = sessions
|
161
162
|
return unless s
|
162
163
|
|
163
164
|
unless using? ::Rack::Session::Cookie
|
164
|
-
unless secret = Web.session_secret
|
165
|
-
require
|
165
|
+
unless (secret = Web.session_secret)
|
166
|
+
require "securerandom"
|
166
167
|
secret = SecureRandom.hex(64)
|
167
168
|
end
|
168
169
|
|
169
|
-
options = {
|
170
|
+
options = {secret: secret}
|
170
171
|
options = options.merge(s.to_hash) if s.respond_to? :to_hash
|
171
172
|
|
172
173
|
middlewares.unshift [[::Rack::Session::Cookie, options], nil]
|
@@ -180,13 +181,13 @@ module Sidekiq
|
|
180
181
|
klass = self.class
|
181
182
|
|
182
183
|
::Rack::Builder.new do
|
183
|
-
%w
|
184
|
+
%w[stylesheets javascripts images].each do |asset_dir|
|
184
185
|
map "/#{asset_dir}" do
|
185
|
-
run ::Rack::File.new("#{ASSETS}/#{asset_dir}", {
|
186
|
+
run ::Rack::File.new("#{ASSETS}/#{asset_dir}", {"Cache-Control" => "public, max-age=86400"})
|
186
187
|
end
|
187
188
|
end
|
188
189
|
|
189
|
-
middlewares.each {|middleware, block| use(*middleware, &block) }
|
190
|
+
middlewares.each { |middleware, block| use(*middleware, &block) }
|
190
191
|
|
191
192
|
run WebApplication.new(klass)
|
192
193
|
end
|
@@ -196,18 +197,9 @@ module Sidekiq
|
|
196
197
|
Sidekiq::WebApplication.helpers WebHelpers
|
197
198
|
Sidekiq::WebApplication.helpers Sidekiq::Paginator
|
198
199
|
|
199
|
-
Sidekiq::WebAction.class_eval
|
200
|
-
|
201
|
-
|
202
|
-
if defined?(::ActionDispatch::Request::Session) &&
|
203
|
-
!::ActionDispatch::Request::Session.method_defined?(:each)
|
204
|
-
# mperham/sidekiq#2460
|
205
|
-
# Rack apps can't reuse the Rails session store without
|
206
|
-
# this monkeypatch, fixed in Rails 5.
|
207
|
-
class ActionDispatch::Request::Session
|
208
|
-
def each(&block)
|
209
|
-
hash = self.to_hash
|
210
|
-
hash.each(&block)
|
200
|
+
Sidekiq::WebAction.class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
201
|
+
def _render
|
202
|
+
#{ERB.new(File.read(Web::LAYOUT)).src}
|
211
203
|
end
|
212
|
-
|
204
|
+
RUBY
|
213
205
|
end
|