Packages
ankh
0.8.11
0.17.0
0.16.0
0.15.0
0.14.5
0.14.4
0.14.3
0.14.2
0.14.1
0.14.0
0.13.0
0.12.1
0.12.0
0.11.0
0.10.0
0.9.0
0.8.11
0.8.10
0.8.9
0.8.8
0.8.7
0.8.6
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.2
0.7.1
0.7.0
0.6.0
0.5.3
0.5.2
0.5.1
0.5.0
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.1
0.3.0
0.1.1
0.1.0
0.0.5
0.0.4
0.0.3
0.0.2
0.0.1
Pure Elixir HTTP/2 implementation
Current section
Files
Jump to
Current section
Files
lib/ankh/tls.ex
defmodule Ankh.TLS do
@moduledoc """
TLS transport module
"""
require Logger
alias Ankh.Transport
@behaviour Transport
@default_connect_options binary: true,
active: false,
secure_renegotiate: true,
cacertfile: CAStore.file_path()
@impl Transport
def connect(%URI{host: host, port: port}, options \\ []) do
hostname = String.to_charlist(host)
options = Keyword.merge(options, @default_connect_options)
with {:ok, socket} <- :ssl.connect(hostname, port, options),
:ok <- :ssl.setopts(socket, active: :once) do
{:ok, socket}
end
end
@impl Transport
def accept(socket, options \\ []) do
options = Keyword.merge(options, active: :once)
with :ok <- :ssl.controlling_process(socket, self()),
:ok <- :ssl.setopts(socket, options) do
{:ok, socket}
end
end
@impl Transport
def send(socket, data), do: :ssl.send(socket, data)
@impl Transport
def recv(socket, size), do: :ssl.recv(socket, size)
@impl Transport
def close(socket), do: :ssl.close(socket)
@impl Transport
def handle_msg({:ssl, socket, data}) do
with :ok <- :ssl.setopts(socket, active: :once), do: {:ok, data}
end
@impl Transport
def handle_msg({:ssl_error, _socket, reason}), do: {:error, reason}
@impl Transport
def handle_msg({:ssl_closed, _socket}), do: {:error, :closed}
@impl Transport
def handle_msg(msg), do: {:other, msg}
end