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 curl
in 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?