wfgilman
How do you put a request body in a Plug.Conn?
I’m writing a Plug which verifies a signature in the header of a request. The signature is the SHA256 HMAC hash of the request body signed with a secret. I’m having trouble testing this because I don’t know how to put the request body in the %Conn{} to run it through the plug. Setting up the headers are easy with put_req_header/3. Is there an equivalent for setting the body?
I’m trying to setup my connection like this in my test:
setup %{conn: conn} do
body = %{"some" => "message"}
signature = Plug.Crypto.MessageVerifier.sign(Poison.encode!(body), "s3cret", :sha256)
conn =
conn
|> put_req_header("accept", "application/json")
|> put_req_header("content-type", "application/json")
|> put_req_header("x-request-signature", signature)
|> put_request_body???
{:ok, conn: conn}
end
Marked As Solved
wfgilman
This ended up being the solution to my problem: How to: Plug which verifies header signature signed using request body
Also Liked
idi527
Would something like this conn = %{conn | body_params: body} work for you?
setup %{conn: conn} do
body_params = %{"some" => "message"}
signature =
body_params
|> Poison.encode!()
|> Plug.Crypto.MessageVerifier.sign("s3cret", :sha256)
conn =
conn
|> put_req_header("accept", "application/json")
|> put_req_header("content-type", "application/json")
|> put_req_header("x-request-signature", signature)
|> put_body_params(body_params)
{:ok, conn: conn}
end
defp put_body_params(conn, body_params) do
%{conn | body_params: body_params}
end
Or as a workaround you might put your body in conn.private.
flash4syth
I tried to use this solution to populate a %Plug.Conn{}'s body_params key; however, the conn.body_params was set to %{} after calling conn = post(conn, "/path") in my test. However, when I simply wrote it thus:
post(conn, “/path”, %{“my_params” => “param_val”, …})
Then it worked like a charm–conn.body_params was populated.
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #advent-of-code
- #elixirconf-us
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #performance








