Skip to content

Commit a3321c6

Browse files
authored
Add backwards compatibility for Rack 2 and below
1 parent 1c3f674 commit a3321c6

2 files changed

Lines changed: 27 additions & 1 deletion

File tree

lib/secure_headers/middleware.rb

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,12 @@ def initialize(app)
99
def call(env)
1010
req = Rack::Request.new(env)
1111
status, headers, response = @app.call(env)
12-
headers = Rack::Headers[headers]
12+
13+
# Rack::Headers is available in Rack 3.x and later
14+
# So we should pull the headers into that structure if possible
15+
if defined?(Rack::Headers)
16+
headers = Rack::Headers[headers]
17+
end
1318

1419
config = SecureHeaders.config_for(req)
1520
flag_cookies!(headers, override_secure(env, config.cookies)) unless config.cookies == OPT_OUT

spec/lib/secure_headers/middleware_spec.rb

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,27 @@ module SecureHeaders
3636
expect(env[ContentSecurityPolicyConfig::HEADER_NAME]).to match("example.org")
3737
end
3838

39+
context "Rack::Headers conversion" do
40+
it "converts headers to Rack::Headers when Rack::Headers is defined" do
41+
if defined?(Rack::Headers)
42+
_, headers, = middleware.call(Rack::MockRequest.env_for("https://localhost", {}))
43+
expect(headers.is_a?(Rack::Headers)).to be true
44+
else
45+
skip "Rack::Headers is not defined in this version of Rack"
46+
end
47+
end
48+
49+
it "keeps headers as a hash when Rack::Headers is not defined" do
50+
# Temporarily hide the Rack::Headers constant if it exists
51+
if defined?(Rack::Headers)
52+
hide_const("Rack::Headers")
53+
end
54+
55+
_, headers, = middleware.call(Rack::MockRequest.env_for("https://localhost", {}))
56+
expect(headers.is_a?(Hash)).to be true
57+
end
58+
end
59+
3960
context "cookies" do
4061
before(:each) do
4162
reset_config

0 commit comments

Comments
 (0)