jnnks
Need help using Erlang library Quicer in Elixir
I want to use the library GitHub - qzhuyan/quicer which is written in Erlang.
The readme contains a sample snippet:
application:ensure_all_started(quicer),
Port = 4567,
LOptions = [ {certfile, "cert.pem"}
, {keyfile, "key.pem"}
, {alpn, ["sample"]}
, {peer_bidi_stream_count, 1}
],
{ok, L} = quicer:listen(Port, LOptions),
{ok, Conn} = quicer:accept(L, [], 120000),
{ok, Conn} = quicer:handshake(Conn),
{ok, Stm} = quicer:accept_stream(Conn, []),
receive {quic, <<"ping">>, Stm, _Props} -> ok end,
{ok, 4} = quicer:send(Stm, <<"pong">>),
quicer:close_listener(L).
which I translated to the following:
:application.ensure_all_started(:quicer)
port = 4567
l_options = [
{:certfile, "cert.pem"},
{:keyfile, "key.pem"},
{:alpn, ["sample"]},
{:peer_bidi_stream_count, 1}
]
# {:error, :badarg}
{:ok, listener} = :quicer.listen(port, l_options)
{:ok, conn} = :quicer.accept(listener, [], 120_000)
{:ok, conn} = :quicer.handshake(conn)
{:ok, stm} = :quicer.accept_stream(conn, [])
receive do
{:quic, <<"ping">>, stm, _props} -> :ok
end
{:ok, 4} = :quicer.send(stm, <<"pong">>)
:quicer.close_listener(listener)
Something seems to be wrong, as there is a badarg (marked above).
ElixirLS Dialyzer is reporting the following:
The call quicer:listen
(_port@1 :: 4567,
_l_options@1 ::
[{'alpn', [<<_:48>>, ...]} |
{'certfile', <<_:64>>} |
{'keyfile', <<_:56>>} |
{'peer_bidi_stream_count', 1},
...]) breaks the contract
(listen_on(), listen_opts()) ->
{'ok', listener_handler()} |
{'error', 'listener_open_error', atom_reason()} |
{'error', 'listener_start_error', atom_reason()}
What am I missing?
PS: ChatGPT came to the same translation ![]()
Most Liked
paulanthonywilson
I think the problem is the strings. Remember the thing where strings are lists of characters in Erlang?
Try using single quotes in place of double quotes in the translation. eg
{:certfile, 'cert.pem'}
al2o3cr
Like in the last ChatGPT Erlang-to-Elixir translation, the robot doesn’t do a good job spotting the difference between binaries and charlists. ![]()
Dialyzer is complaining about the binaries in your options, since listen_opts is defined as:
alpn() is defined as string() - so charlists
file:filename() is defined in stdlib as… string() - so charlists
al2o3cr
There are many places inside of :quicer.listen’s NIF that can return {:error, :badarg}:
Passing an empty list of options results in {:error, :badarg} because of checks for required parameters, for instance the ones on line 302-316.
One other thing that jumps out: the change to add support for certfile and keyfile (instead of just cert and key) isn’t in a released package, it was just added a bit more than a month ago. If you’ve installed quicer from Hex, try using cert and key (the old names) instead.







