ndrean
Plug.Conn: response back from post
I have an Elixir server and I “post” some data to an endpoint in order to broadcast this data with SSE. For the moment, I haven’t connected the front-end to check, only testing with curlin the terminal. I am surprised to get back the message I am posting and can’t just set a response like “ok”.
I do:
curl -X POST -H "content-type: application/json" -d '{"test": "hello"}' https://localhost:4000/post
# -> response:
event: message
data: {"test": "hello"}
The following Plug server is started by the app supervisor ({Plug.Cowboy, scheme: :http, plug: My.Router, options: plug_options}):
defmodule My.Router do
import Plug.Conn
use Plug.Router
plug(:match)
plug(Plug.Parsers, parsers: [:json], pass: ["text/*", "application/json"], json_decoder: Jason)
plug(:dispatch)
post "/post" do
data = Jason.encode!(conn.params)
msg = "event: message\ndata: #{data}\n\n"
conn =
conn
|> put_resp_header("connection", "keep-alive")
|> put_resp_header("content-type", "text/event-stream")
|> send_chunked(200)
{:ok, conn} = chunk(conn, msg)
conn
end
It is useless to get the message back. Furthermore, I can’t do something like send_resp(conn, 200, :ok) as I get an error message saying that the response was already sent.
Any experience?
First Post!
al2o3cr
The output from curl there looks like the server-sent event content you requested be sent by calling chunk(conn, msg); what else did you expect to happen?
Last Post!
ndrean
Thanks for taking a look. Yes, it may seem dumb but I realised afterwards that the method chunk was sending a response and setting the conn.state to :set so I could not send an appropriate response afterwards. I wanted a standard response as found in the doc of the Plug middleware: conn |> resp(200, "broadcasted") |> send_resp(). So it was just wrong. I removed the chunk from this POST request handler, pubsub the payload, and a GET endpoint has a receive do that emits the payload through SSE.
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
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #metaprogramming
- #security
- #hex









