QUIC (Next-generation transport protocol) erlang library.
msquic NIF binding.
Project Status: Preview
| OS | Status |
|---|---|
| Linux | Supported |
| macOS | Supported |
| Windows | Help Needed |
{deps, [
{quicer, {git, "https://github.com/emqx/quic.git", {tag, "0.4.4"}}},
...defp deps do
[
{:quicer, git: "https://github.com/emqx/quic.git", tag: "0.4.4"},
...
]
endapplication: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).application:ensure_all_started(quicer),
Port = 4567,
{ok, Conn} = quicer:connect("localhost", Port, [{alpn, ["sample"]}, {verify, none}], 5000),
{ok, Stm} = quicer:start_stream(Conn, []),
{ok, 4} = quicer:send(Stm, <<"ping">>),
receive {quic, <<"pong">>, Stm, _Props} -> ok end,
ok = quicer:close_connection(Conn).%% Connect to google and disconnect,
%% You could also tweak the parameters to see how it goes
{ok, Conn} = quicer:connect("google.com", 443, [{alpn, ["h3"]},
{verify, verify_peer},
{peer_unidi_stream_count, 3}], 5000),
quicer:shutdown_connection(Conn).refer to test dir.
-
Understand the
handlesand theownershipin Terminology -
Then check how to receives the data and signals: Messages
-
Read more in msquic doc
make doc
firefox doc/index.html- OTP25+
- rebar3
- cmake3.16+
make ciQUICER_TLS_VER selects where libcrypto comes from:
| Value | Behaviour |
|---|---|
quictls |
Build and link the bundled quictls submodule. Works on any supported system. |
sys |
Link the libcrypto provided by the system. Requires OpenSSL 3.0 or newer; the build fails on older systems. |
auto |
Use sys when the system provides OpenSSL >= 3.0, quictls otherwise. |
Prefer sys where it is available: the NIF then picks up the distribution's
libcrypto security updates without rebuilding quicer. Use auto to get that
on modern systems while still building on distributions that ship OpenSSL
1.1.1 or older, such as Ubuntu 20.04, Debian 11, EL8, EL7 and Amazon Linux 2.
QUICER_TLS_VER=auto makeThe value is part of the pre-built package name, so sys and quictls
artifacts are published and cached independently.
Debug log could be enabled to print to stdout with the envvar QUIC_LOGGING_TYPE=stdout
QUIC_LOGGING_TYPE=stdout make%% Debug one testcase
QUIC_LOGGING_TYPE=stdout rebar3 ct --suite test/quicer_connection_SUITE.erl --case tc_conn_basic_verify_peerClient could specify the connect param sslkeylogfile to record tls secrets for wireshark to decrypt.
{ok, Conn} = quicer:connect(
"google.com",
443,
[
{verify, verify_peer},
{sslkeylogfile, "/tmp/SSLKEYLOGFILE"},
{peer_unidi_stream_count, 3},
{alpn, ["h3"]}
],
5000
)Supports patch-level hot upgrades only (e.g., a.b.x -> a.b.y).
Apache License Version 2.0