Skip to content

Commit afa7fc4

Browse files
committed
Use a new class to keep @env within the thread.
1 parent f9e3827 commit afa7fc4

File tree

1 file changed

+65
-52
lines changed

1 file changed

+65
-52
lines changed

lib/inertia_rails/middleware.rb

Lines changed: 65 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -5,78 +5,91 @@ def initialize(app)
55
end
66

77
def call(env)
8-
status, headers, body = @app.call(env)
9-
request = ActionDispatch::Request.new(env)
8+
InertiaRailsRequest.new(@app, env)
9+
.response
10+
end
1011

11-
::InertiaRails.reset!
12+
class InertiaRailsRequest
13+
def initialize(app, env)
14+
@app = app
15+
@env = env
16+
end
1217

13-
# Inertia errors are added to the session via redirect_to
14-
request.session.delete(:inertia_errors) unless keep_inertia_errors?(status, env)
18+
def response
19+
status, headers, body = @app.call(@env)
20+
request = ActionDispatch::Request.new(@env)
1521

16-
status = 303 if inertia_non_post_redirect?(status, env)
22+
::InertiaRails.reset!
1723

18-
return stale_inertia_get?(env) ? force_refresh(request) : [status, headers, body]
19-
end
24+
# Inertia errors are added to the session via redirect_to
25+
request.session.delete(:inertia_errors) unless keep_inertia_errors?(status)
2026

21-
private
27+
status = 303 if inertia_non_post_redirect?(status)
2228

23-
def keep_inertia_errors?(status, env)
24-
redirect_status?(status) || stale_inertia_request?(env)
25-
end
29+
stale_inertia_get? ? force_refresh(request) : [status, headers, body]
30+
end
2631

27-
def stale_inertia_request?(env)
28-
inertia_request?(env) && version_stale?(env)
29-
end
32+
private
3033

31-
def redirect_status?(status)
32-
[301, 302].include? status
33-
end
34+
def keep_inertia_errors?(status)
35+
redirect_status?(status) || stale_inertia_request?
36+
end
3437

35-
def non_get_redirectable_method?(env)
36-
["PUT", "PATCH", "DELETE"].include? request_method(env)
37-
end
38+
def stale_inertia_request?
39+
inertia_request? && version_stale?
40+
end
3841

39-
def inertia_non_post_redirect?(status, env)
40-
inertia_request?(env) && redirect_status?(status) && non_get_redirectable_method?(env)
41-
end
42+
def redirect_status?(status)
43+
[301, 302].include? status
44+
end
4245

43-
def stale_inertia_get?(env)
44-
get?(env) && stale_inertia_request?(env)
45-
end
46+
def non_get_redirectable_method?
47+
['PUT', 'PATCH', 'DELETE'].include? request_method
48+
end
4649

47-
def get?(env)
48-
request_method(env) == "GET"
49-
end
50+
def inertia_non_post_redirect?(status)
51+
inertia_request? && redirect_status?(status) && non_get_redirectable_method?
52+
end
5053

51-
def request_method(env)
52-
env["REQUEST_METHOD"]
53-
end
54+
def stale_inertia_get?
55+
get? && stale_inertia_request?
56+
end
5457

55-
def inertia_version(env)
56-
env["HTTP_X_INERTIA_VERSION"]
57-
end
58+
def get?
59+
request_method == 'GET'
60+
end
5861

59-
def inertia_request?(env)
60-
env["HTTP_X_INERTIA"].present?
61-
end
62+
def request_method
63+
@env['REQUEST_METHOD']
64+
end
6265

63-
def version_stale?(env)
64-
sent_version(env) != saved_version
65-
end
66+
def inertia_version
67+
@env['HTTP_X_INERTIA_VERSION']
68+
end
6669

67-
def sent_version(env)
68-
return nil if inertia_version(env).nil?
70+
def inertia_request?
71+
@env['HTTP_X_INERTIA'].present?
72+
end
6973

70-
InertiaRails.version.is_a?(Numeric) ? inertia_version(env).to_f : inertia_version(env)
71-
end
74+
def version_stale?
75+
sent_version != saved_version
76+
end
7277

73-
def saved_version
74-
InertiaRails.version.is_a?(Numeric) ? InertiaRails.version.to_f : InertiaRails.version
75-
end
78+
def sent_version
79+
return nil if inertia_version.nil?
80+
81+
InertiaRails.version.is_a?(Numeric) ? inertia_version.to_f : inertia_version
82+
end
7683

77-
def force_refresh(request)
78-
request.flash.keep
79-
Rack::Response.new("", 409, { "X-Inertia-Location" => request.original_url }).finish
84+
def saved_version
85+
InertiaRails.version.is_a?(Numeric) ? InertiaRails.version.to_f : InertiaRails.version
86+
end
87+
88+
def force_refresh(request)
89+
request.flash.keep
90+
Rack::Response.new('', 409, {'X-Inertia-Location' => request.original_url}).finish
91+
end
8092
end
8193
end
8294
end
95+

0 commit comments

Comments
 (0)