Skip to content

Commit f9e3827

Browse files
committed
make middleware thread safe
1 parent 6246be0 commit f9e3827

File tree

2 files changed

+47
-30
lines changed

2 files changed

+47
-30
lines changed

lib/inertia_rails/middleware.rb

Lines changed: 29 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -5,70 +5,69 @@ def initialize(app)
55
end
66

77
def call(env)
8-
@env = env
9-
108
status, headers, body = @app.call(env)
119
request = ActionDispatch::Request.new(env)
1210

1311
::InertiaRails.reset!
1412

15-
# Inertia errors are added to the session via redirect_to
16-
request.session.delete(:inertia_errors) unless keep_inertia_errors?(status)
13+
# Inertia errors are added to the session via redirect_to
14+
request.session.delete(:inertia_errors) unless keep_inertia_errors?(status, env)
1715

18-
status = 303 if inertia_non_post_redirect?(status)
16+
status = 303 if inertia_non_post_redirect?(status, env)
1917

20-
return stale_inertia_get? ? force_refresh(request) : [status, headers, body]
18+
return stale_inertia_get?(env) ? force_refresh(request) : [status, headers, body]
2119
end
2220

2321
private
2422

25-
def keep_inertia_errors?(status)
26-
redirect_status?(status) || stale_inertia_request?
23+
def keep_inertia_errors?(status, env)
24+
redirect_status?(status) || stale_inertia_request?(env)
2725
end
2826

29-
def stale_inertia_request?
30-
inertia_request? && version_stale?
27+
def stale_inertia_request?(env)
28+
inertia_request?(env) && version_stale?(env)
3129
end
3230

3331
def redirect_status?(status)
3432
[301, 302].include? status
3533
end
3634

37-
def non_get_redirectable_method?
38-
['PUT', 'PATCH', 'DELETE'].include? request_method
35+
def non_get_redirectable_method?(env)
36+
["PUT", "PATCH", "DELETE"].include? request_method(env)
3937
end
4038

41-
def inertia_non_post_redirect?(status)
42-
inertia_request? && redirect_status?(status) && non_get_redirectable_method?
39+
def inertia_non_post_redirect?(status, env)
40+
inertia_request?(env) && redirect_status?(status) && non_get_redirectable_method?(env)
4341
end
4442

45-
def stale_inertia_get?
46-
get? && stale_inertia_request?
43+
def stale_inertia_get?(env)
44+
get?(env) && stale_inertia_request?(env)
4745
end
4846

49-
def get?
50-
request_method == 'GET'
47+
def get?(env)
48+
request_method(env) == "GET"
5149
end
5250

53-
def request_method
54-
@env['REQUEST_METHOD']
51+
def request_method(env)
52+
env["REQUEST_METHOD"]
5553
end
5654

57-
def inertia_version
58-
@env['HTTP_X_INERTIA_VERSION']
55+
def inertia_version(env)
56+
env["HTTP_X_INERTIA_VERSION"]
5957
end
6058

61-
def inertia_request?
62-
@env['HTTP_X_INERTIA'].present?
59+
def inertia_request?(env)
60+
env["HTTP_X_INERTIA"].present?
6361
end
6462

65-
def version_stale?
66-
sent_version != saved_version
63+
def version_stale?(env)
64+
sent_version(env) != saved_version
6765
end
6866

69-
def sent_version
70-
return nil if inertia_version.nil?
71-
InertiaRails.version.is_a?(Numeric) ? inertia_version.to_f : inertia_version
67+
def sent_version(env)
68+
return nil if inertia_version(env).nil?
69+
70+
InertiaRails.version.is_a?(Numeric) ? inertia_version(env).to_f : inertia_version(env)
7271
end
7372

7473
def saved_version
@@ -77,7 +76,7 @@ def saved_version
7776

7877
def force_refresh(request)
7978
request.flash.keep
80-
Rack::Response.new('', 409, {'X-Inertia-Location' => request.original_url}).finish
79+
Rack::Response.new("", 409, { "X-Inertia-Location" => request.original_url }).finish
8180
end
8281
end
8382
end

spec/inertia/middleware_spec.rb

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,24 @@
2828

2929
it { is_expected.to eq 303 }
3030
end
31+
32+
it 'is thread safe' do
33+
delete_request_proc = -> { delete redirect_test_path, headers: { 'X-Inertia' => true } }
34+
get_request_proc = -> { get empty_test_path }
35+
36+
statusses = []
37+
38+
threads = []
39+
40+
100.times do
41+
threads << Thread.new { statusses << delete_request_proc.call }
42+
threads << Thread.new { get_request_proc.call }
43+
end
44+
45+
threads.each(&:join)
46+
47+
expect(statusses.uniq).to eq([303])
48+
end
3149
end
3250

3351
context 'a request not originating from inertia' do

0 commit comments

Comments
 (0)