Packages
ace
0.16.7
0.19.0
0.18.10
0.18.9
0.18.8
0.18.7
0.18.6
0.18.5
0.18.4
0.18.3
0.18.2
0.18.1
0.18.0
0.17.1
0.17.0
0.16.8
0.16.7
0.16.6
0.16.5
0.16.4
0.16.3
0.16.2
0.16.1
0.16.0
0.15.11
0.15.10
0.15.9
0.15.8
0.15.7
0.15.6
retired
0.15.5
0.15.4
0.15.3
0.15.2
0.15.1
0.15.0
0.14.8
0.14.7
0.14.6
0.14.5
0.14.4
0.14.3
0.14.2
0.14.1
0.14.0
0.13.1
0.13.0
0.12.1
0.12.0
retired
0.11.1
0.11.0
0.10.0
0.9.3
0.9.2
0.9.1
0.9.0
0.8.1
0.8.0
0.7.1
0.7.0
0.6.3
0.6.2
0.6.1
0.6.0
0.5.2
0.5.1
0.5.0
0.4.0
0.3.0
0.2.0
HTTP web server and client, supports http1 and http2
Current section
Files
Jump to
Current section
Files
lib/ace/socket.ex
defmodule Ace.Socket do
@moduledoc """
Wrapper to normalise interactions with tcp or tls sockets.
NOTE: tls sockets use the `:ssl` module and are identified with `:ssl` atom
"""
@typedoc """
Wrapped tcp socket or tls socket.
"""
@type t :: {:tcp, :inet.socket()} | {:ssl, :"ssl.SslSocket"}
@typedoc """
Wrapped listen socket.
"""
@type listen_socket :: {:ssl, :"ssl.ListenSocket"} | {:tcp, :inet.socket()}
def accept({:tcp, listen_socket}) do
case :gen_tcp.accept(listen_socket) do
{:ok, socket} ->
{:ok, {:tcp, socket}}
{:error, reason} ->
{:error, reason}
end
end
def accept({:ssl, listen_socket}) do
case :ssl.transport_accept(listen_socket) do
{:ok, socket} ->
case :ssl.ssl_accept(socket) do
:ok ->
{:ok, {:ssl, socket}}
{:error, :closed} ->
{:error, :econnaborted}
{:error, reason} ->
{:error, reason}
end
{:error, reason} ->
{:error, reason}
end
end
def port({:tcp, socket}) do
:inet.port(socket)
end
def port({:ssl, socket}) do
{:ok, {_, port}} = :ssl.sockname(socket)
{:ok, port}
end
def negotiated_protocol({:tcp, _socket}) do
:http1
end
def negotiated_protocol({:ssl, socket}) do
case :ssl.negotiated_protocol(socket) do
{:ok, "h2"} ->
:http2
{:ok, "http/1.1"} ->
:http1
{:error, :protocol_not_negotiated} ->
:http1
end
end
def set_active({:tcp, socket}) do
:inet.setopts(socket, active: :once)
end
def set_active({:ssl, socket}) do
:ssl.setopts(socket, active: :once)
end
def send({:tcp, socket}, message) do
:gen_tcp.send(socket, message)
end
def send({:ssl, socket}, message) do
:ssl.send(socket, message)
end
end