NaN
Getting :gun_error {:stream_error, :protocol_error, :"Stream reset by server."}
:gun_error : {:stream_error, :protocol_error, :"Stream reset by server."}
In Phoenix. The stream ref is created, but somewhere before upgrade the above error presents itself. The request is never passed to &Node.Socket.init/2 Non-tls connection work fine.
Certs from GlobalSign. The same cert works fine over the web for Phx.
Any ideas??
{:gun, "~> 2.0"}
{:plug_cowboy, "~> 2.5"}
server:
defmodule Node.Server do
use GenServer
def start_link(opts) do
GenServer.start_link(__MODULE__, opts, name: __MODULE__)
end
def init(opts) do
routes = [
{:_,
[
{"/", Node.Socket, []}
]}
]
# Compile the routes into a dispatch list
dispatch = :cowboy_router.compile(routes)
{protocol, start_fn, opts} =
case System.get_env("IS_DOCKER") do
"true" ->
{:https, &:cowboy.start_tls/3,
[
{:port, opts.port},
{:cacertfile, "/app/priv/ssl/http/ca.crt"},
{:certfile, "/app/priv/ssl/http/server.crt"},
{:keyfile, "/app/priv/ssl/http/server.key"},
]}
_ ->
{:http, &:cowboy.start_clear/3,
[
{:port, opts.port}
]}
end
{:ok, _} =
start_fn.(
protocol,
opts,
%{
env: %{dispatch: dispatch}
}
)
{:ok, %{}}
end
end
client:
defp connect_to_node({admin_domain, admin_port, port} = node, token, state) do
admin_domain = admin_domain |> String.to_charlist()
options =
case System.get_env("IS_DOCKER") do
"true" ->
%{
transport: :tls,
tls_opts: [
{:port, port},
{:verify, :verify_peer},
{:server_name_indication, admin_domain},
{:customize_hostname_check, [{:match_fun, :public_key.pkix_verify_hostname_match_fun(:https)}]},
{:cacerts, :public_key.cacerts_get()}
]
}
_ ->
%{
tcp_opts: [{:port, port}]
}
end
{:ok, conn_pid} = :gun.open(admin_domain, admin_port, options)
Logger.debug("Attempting to connect to Admin Node @ #{admin_domain}:#{admin_port} from local port #{port}")
case :gun.await_up(conn_pid) do
{:ok, _} ->
token = token || fetch_token()
headers = %{
"authorization" => "#{token}"
}
# created fine here
stream_ref = :gun.ws_upgrade(conn_pid, ~c"/", headers) |> IO.inspect()
Node.Identity.set(%{
connected_node: node
})
if Node.Identity.get().primary_node != node do
:timer.send_after(900_000, self(), :connect_to_primary)
end
{:ok, %{state | conn_pid: conn_pid, stream_ref: stream_ref}}
{:error, error} ->
Logger.debug("Failed to connect to Admin Node @ #{admin_domain}:#{admin_port} from local port #{port} | Error: #{inspect(error)}")
:gun.shutdown(conn_pid)
{:error, state}
end
end
Node.Socket.inti : (again, non-tls auths fine, but this is never called when using tls)
def init(req, _opts) do
Logger.debug("Initiating websocket connection with request: #{inspect(req)}")
case Map.get(req.headers, "authorization") do
nil ->
:cowboy_req.reply(401, req)
{:cowboy_websocket, req, %{}}
auth ->
{:ok, shared_key} = Node.Identity.shared_key()
case Node.Auth.decrypt(auth, shared_key) do
{:ok, _decrypted} ->
{:cowboy_websocket, req, %{}, %{idle_timeout: :infinity}}
_ ->
:cowboy_req.reply(401, req)
{:cowboy_websocket, req, %{}}
end
end
end
1/9/23 ~6:30 moved due to cat mistake
Most Liked
NaN
No worries. TY… its just as likely you mention something that solves it. worst case someone learns something.
1
Popular in Questions
Background
Let’s assume I have a typical GenServer that receives messages as requests, does some operation in a DB and returns responses....
New
After calling mix ecto.create I get this error:
17:00:32.162 [error] GenServer #PID<0.412.0> terminating
** (Postgrex.Error) FATAL...
New
I have seen a lot of code which picks the first element from a list using Enum.at(0) instead of List.first. Is there a reason why people ...
New
can someone please explain to me how Enum.reduce works with maps
New
I am VERY much an elixir newbie. I have taken one elixir course and one phoenix course on Udemy. During that course, I saw the instructor...
New
I am trying to run a deploy with docker and I successfully runned with this command:
docker build -t romenigld/blog-prod .
but when I t...
New
What is the difference between System.get_env and Application.get_env? For example, what are best practices to use one versus another.
New
Hey,
Just curious what are the main benefits of Elixir compared to Clojure?
When is Elixir more useful than Clojure and vice versa?
Th...
New
Can someone explain the settings of pool_size of Ecto in config file? and what is the recommend size?
Thanks
New
In AR this is so simple
@articles = current_user.articles
How to do in Ecto?
def index(conn, _params) do
current_user = conn.assig...
New
Other popular topics
This post is an instruction guide to help you setup your Neovim for Elixir development from scratch. It includes general information on h...
New
In Ruby, I can go:
User.find_by(email: "foobar@email.com").update(email: "hello@email.com")
How can I do something similar in Elixir? ...
New
can someone please explain to me how Enum.reduce works with maps
New
I have a server on AWS, and was running a load test using artillery. When looking at the Phoenix dashboard I see the Ports going to 100% ...
New
I would like to know what is the best IDE for elixir development?
New
I have an umbrella app.
Some of the apps inside depend on other apps in the umbrella, unsurprisingly.
I'm writing a test for one of t...
New
Hey guys.
I'm new to elixir and im really stocked about it. But I ran into a bit of problem - I need to convert a date sting, for examp...
New
When I run the Plug and I recompile I wind up having to use Ctrl C to quit iex and start again. Witht the help of rlwrap I can use the cu...
New
I have a super simple question about elixir - how would I take a file like this
foo bar baz
and output a new file that enumerates th...
New
by Lance Halvorsen
Elixir and Phoenix are generating tremendous excitement as an unbeatable platform for building modern web application...
New








