Skip to content

Commit 1031d51

Browse files
committed
fix(middleware): ensure headers are wrapped with Rack::Headers
Add `Rack::Headers` wrapping to middleware to prevent header manipulation issues. Added a test to verify cookies remain as an array when flagged if already in array format.
1 parent 945055b commit 1031d51

File tree

2 files changed

+13
-2
lines changed

2 files changed

+13
-2
lines changed

lib/secure_headers/middleware.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ 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]
1213

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

spec/lib/secure_headers/middleware_spec.rb

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,16 +83,26 @@ module SecureHeaders
8383
end
8484

8585
it "flags cookies with a combination of SameSite configurations" do
86-
cookie_middleware = Middleware.new(lambda { |env| [200, env.merge("Set-Cookie" => ["_session=foobar", "_guest=true"]), "app"] })
86+
cookie_middleware = Middleware.new(lambda { |env| [200, env.merge("Set-Cookie" => "_session=foobar\n_guest=true"), "app"] })
8787

88-
Configuration.default { |config| config.cookies = { samesite: { lax: { except: ["_session"] }, strict: { only: ["_session"] } }, httponly: OPT_OUT, secure: OPT_OUT} }
88+
Configuration.default { |config| config.cookies = { samesite: { lax: { except: ["_session"] }, strict: { only: ["_session"] } }, httponly: OPT_OUT, secure: OPT_OUT } }
8989
request = Rack::Request.new("HTTPS" => "on")
9090
_, env = cookie_middleware.call request.env
9191

9292
expect(env["Set-Cookie"]).to match("_session=foobar; SameSite=Strict")
9393
expect(env["Set-Cookie"]).to match("_guest=true; SameSite=Lax")
9494
end
9595

96+
it "keeps cookies as array after flagging if they are already an array" do
97+
cookie_middleware = Middleware.new(lambda { |env| [200, env.merge("Set-Cookie" => ["_session=foobar", "_guest=true"]), "app"] })
98+
99+
Configuration.default { |config| config.cookies = { samesite: { lax: { except: ["_session"] }, strict: { only: ["_session"] } }, httponly: OPT_OUT, secure: OPT_OUT } }
100+
request = Rack::Request.new("HTTPS" => "on")
101+
_, env = cookie_middleware.call request.env
102+
103+
expect(env["Set-Cookie"]).to match_array(["_session=foobar; SameSite=Strict", "_guest=true; SameSite=Lax"])
104+
end
105+
96106
it "disables secure cookies for non-https requests" do
97107
Configuration.default { |config| config.cookies = { secure: true, httponly: OPT_OUT, samesite: OPT_OUT } }
98108

0 commit comments

Comments
 (0)