Skip to content

Commit f28e1a4

Browse files
authored
Support :sign and :encrypt options with Plug.Test.put_req_cookie/4 (#1301)
Closes #1300.
1 parent 59cf2b5 commit f28e1a4

3 files changed

Lines changed: 43 additions & 4 deletions

File tree

lib/plug/conn.ex

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1677,7 +1677,8 @@ defmodule Plug.Conn do
16771677
update_cookies(%{conn | resp_cookies: resp_cookies}, &Map.put(&1, key, value))
16781678
end
16791679

1680-
defp maybe_sign_or_encrypt_cookie(conn, key, value, opts) do
1680+
@doc false
1681+
def maybe_sign_or_encrypt_cookie(%Conn{} = conn, key, value, opts) do
16811682
{sign?, opts} = Keyword.pop(opts, :sign, false)
16821683
{encrypt?, opts} = Keyword.pop(opts, :encrypt, false)
16831684

lib/plug/test.ex

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -228,11 +228,23 @@ defmodule Plug.Test do
228228

229229
@doc """
230230
Puts a request cookie.
231+
232+
## Options
233+
234+
* `:max_age` - the cookie max-age, in seconds. Unset by default.
235+
* `:sign` - when true, signs the cookie.
236+
* `:encrypt` - when true, encrypts the cookie.
237+
231238
"""
232-
@spec put_req_cookie(Conn.t(), binary, binary) :: Conn.t()
233-
def put_req_cookie(conn, key, value) when is_binary(key) and is_binary(value) do
239+
@spec put_req_cookie(Conn.t(), binary, any, keyword) :: Conn.t()
240+
def put_req_cookie(%Conn{} = conn, key, value, opts \\ [])
241+
when is_binary(key) and is_list(opts) do
234242
conn = delete_req_cookie(conn, key)
235-
%{conn | req_headers: [{"cookie", "#{key}=#{value}"} | conn.req_headers]}
243+
opts = Keyword.take(opts, [:max_age, :sign, :encrypt])
244+
245+
{to_send_value, _opts} = Conn.maybe_sign_or_encrypt_cookie(conn, key, value, opts)
246+
247+
%{conn | req_headers: [{"cookie", "#{key}=#{to_send_value}"} | conn.req_headers]}
236248
end
237249

238250
@doc """

test/plug/conn_test.exs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1249,6 +1249,32 @@ defmodule Plug.ConnTest do
12491249
assert get_cookies(new_conn)["foo"] == get_resp_cookies(conn)["foo"][:value]
12501250
refute Map.has_key?(fetch_cookies(new_conn, encrypted: "foo").cookies, "foo")
12511251
end
1252+
1253+
test "put_req_cookie/4 with sign: true" do
1254+
conn = secret_conn()
1255+
assert get_req_header(conn, "cookie") == []
1256+
1257+
conn = put_req_cookie(conn, "foo", "signed-bar", sign: true)
1258+
assert [cookie] = get_req_header(conn, "cookie")
1259+
assert cookie != "foo=signed-bar"
1260+
assert cookie =~ ~r"foo=[\w\_\.]+"
1261+
1262+
# indicates no options were set to the header, only the signed value
1263+
refute cookie =~ ~r/;/
1264+
end
1265+
1266+
test "put_req_cookie/4 with encrypt: true" do
1267+
conn = secret_conn()
1268+
assert get_req_header(conn, "cookie") == []
1269+
1270+
conn = put_req_cookie(conn, "foo", "encrypted-bar", encrypt: true)
1271+
assert [cookie] = get_req_header(conn, "cookie")
1272+
assert cookie != "foo=encrypted-bar"
1273+
assert cookie =~ ~r"foo=[\w\_\.]+"
1274+
1275+
# indicates no options were set to the header, only the encrypted value
1276+
refute cookie =~ ~r/;/
1277+
end
12521278
end
12531279

12541280
test "fetch_session/2 returns the same conn on subsequent calls" do

0 commit comments

Comments
 (0)