Skip to content

Commit 97b9e32

Browse files
committed
add constraint_to option to SSL middleware
1 parent 2280c84 commit 97b9e32

File tree

2 files changed

+13
-2
lines changed

2 files changed

+13
-2
lines changed

actionpack/lib/action_dispatch/middleware/ssl.rb

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@ module ActionDispatch
3434
# original HSTS directive until it expires. Instead, use the header to tell browsers to
3535
# expire HSTS immediately. Setting `hsts: false` is a shortcut for
3636
# `hsts: { expires: 0 }`.
37+
#
38+
# Redirection can be constrained to only whitelisted requests with `constrain_to`:
39+
#
40+
# config.ssl_options = { redirect: { constrain_to: -> request { request.path !~ /healthcheck/ } } }
3741
class SSL
3842
# Default to 180 days, the low end for https://www.ssllabs.com/ssltest/
3943
# and greater than the 18-week requirement for browser preload lists.
@@ -55,7 +59,7 @@ def initialize(app, redirect: {}, hsts: {}, secure_cookies: true, **options)
5559
else
5660
@redirect = redirect
5761
end
58-
62+
@constrain_to = @redirect && @redirect[:constrain_to] || proc { @redirect }
5963
@secure_cookies = secure_cookies
6064

6165
if hsts != true && hsts != false && hsts[:subdomains].nil?
@@ -80,7 +84,7 @@ def call(env)
8084
flag_cookies_as_secure! headers if @secure_cookies
8185
end
8286
else
83-
return redirect_to_https request if @redirect
87+
return redirect_to_https request if @constrain_to.call(request)
8488
@app.call(env)
8589
end
8690
end

actionpack/test/dispatch/ssl_test.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,13 @@ def assert_redirected(redirect: {}, deprecated_host: nil, deprecated_port: nil,
3939
assert_equal redirect[:body].join, @response.body
4040
end
4141

42+
test 'constrain to can avoid redirect' do
43+
constraining = { constrain_to: -> request { request.path !~ /healthcheck/ } }
44+
45+
assert_not_redirected 'http://example.org/healthcheck', redirect: constraining
46+
assert_redirected from: 'http://example.org/', redirect: constraining
47+
end
48+
4249
test 'https is not redirected' do
4350
assert_not_redirected 'https://example.org'
4451
end

0 commit comments

Comments
 (0)