Packages
bandit
0.5.11
1.12.4
1.12.3
1.12.2
1.12.1
1.12.0
1.11.1
1.11.0
1.10.4
1.10.3
1.10.2
1.10.1
1.10.0
retired
1.9.0
1.8.0
1.7.0
1.6.11
1.6.10
1.6.9
1.6.8
1.6.7
1.6.6
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.5.7
1.5.6
1.5.5
1.5.4
1.5.3
1.5.2
1.5.1
1.5.0
1.4.2
1.4.1
1.4.0
1.3.0
1.2.3
1.2.2
1.2.1
1.2.0
1.1.3
1.1.2
1.1.1
1.1.0
1.0.0
1.0.0-pre.18
1.0.0-pre.17
1.0.0-pre.16
1.0.0-pre.15
1.0.0-pre.14
1.0.0-pre.13
1.0.0-pre.12
1.0.0-pre.11
1.0.0-pre.10
1.0.0-pre.9
1.0.0-pre.8
1.0.0-pre.7
1.0.0-pre.6
1.0.0-pre.5
1.0.0-pre.4
1.0.0-pre.3
1.0.0-pre.2
1.0.0-pre.1
0.7.7
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.11
0.6.10
0.6.9
0.6.8
0.6.7
0.6.6
0.6.5
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.11
0.5.10
0.5.9
0.5.8
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.10
0.4.9
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.2.3
0.2.2
0.2.1
0.2.0
0.1.1
0.1.0
A pure-Elixir HTTP server built for Plug & WebSock apps
Security advisory:
This version has known vulnerabilities.
View advisories
Current section
Files
Jump to
Current section
Files
test/bandit/websocket/autobahn_test.exs
defmodule WebsocketAutobahnTest do
use ExUnit.Case, async: true
# credo:disable-for-this-file Credo.Check.Design.AliasUsage
@moduletag :external_conformance
@moduletag timeout: 3_600_000
defmodule EchoWebSock do
use NoopWebSock
def handle_in({data, opcode: opcode}, state), do: {:push, {opcode, data}, state}
end
@behaviour Plug
@impl Plug
def init(opts), do: opts
@impl Plug
def call(conn, _opts) do
case Bandit.WebSocket.Handshake.valid_upgrade?(conn) do
true -> Plug.Conn.upgrade_adapter(conn, :websocket, {EchoWebSock, :ok, compress: true})
false -> Plug.Conn.send_resp(conn, 204, <<>>)
end
end
@tag capture_log: true
test "autobahn test suite" do
# We can't use ServerHelpers since we need to bind on all interfaces
{:ok, server_pid} =
[plug: __MODULE__, options: [port: 0]]
|> Bandit.child_spec()
|> start_supervised()
{:ok, %{port: port}} = ThousandIsland.listener_info(server_pid)
output =
System.cmd(
"docker",
[
"run",
"--rm",
"-v",
"#{Path.join(__DIR__, "../../support/autobahn_config.json")}:/fuzzingclient.json",
"-v",
"#{Path.join(__DIR__, "../../../autobahn_reports")}:/reports"
] ++
extra_args() ++
[
"--name",
"fuzzingclient",
"crossbario/autobahn-testsuite",
"wstest",
"--mode",
"fuzzingclient",
"-w",
"ws://host.docker.internal:#{port}"
],
stderr_to_stdout: true
)
assert {_, 0} = output
failures =
Path.join(__DIR__, "../../../autobahn_reports/servers/index.json")
|> File.read!()
|> Jason.decode!()
|> Map.get("UnknownServer")
|> Enum.map(fn {test_case, %{"behavior" => res, "behaviorClose" => res_close}} ->
{test_case, res, res_close}
end)
|> Enum.reject(fn {_, res, res_close} ->
(res == "OK" or res == "NON-STRICT" or res == "INFORMATIONAL") and
(res_close == "OK" or res_close == "INFORMATIONAL")
end)
|> Enum.sort_by(fn {code, _, _} -> code end)
assert [] = failures
end
defp extra_args do
case :os.type() do
{:unix, :linux} -> ["--add-host=host.docker.internal:host-gateway"]
_ -> []
end
end
end