HTTP web server and client, supports http1 and http2
defmodule MyApp do
use Ace.HTTP.Service, [port: 8080, cleartext: true]
@impl Raxx.Server
def handle_request(%{method: :GET, path: []}, %{greeting: greeting}) do
response(:ok)
|> set_header("content-type", "text/plain")
|> set_body("#{greeting}, World!")
end
end
The arguments given to use Ace.HTTP.Service are default values when starting the service.
config = %{greeting: "Hello"}
MyApp.start_link(config, [port: 1234])
Here the default port value has been overridden at startup
Ace implements the Raxx HTTP interface. This allows applications to be built with any components from the Raxx ecosystem.
Raxx has tooling for streaming, server-push, routing, api documentation and more. See documentation for details.
The correct version of raxx is included with ace, raxx does not need to be added as a dependency.
If a service is started without the cleartext
it will start using TLS. This requires a certificate and key.
config = %{greeting: "Hello"}
options = [port: 8443, certfile: "path/to/certificate", keyfile: "path/to/key"]
MyApp.start_link(application, options)
TLS is required to serve content via HTTP/2.
The normal way to run services is as part of a projects supervision tree. When starting a new project use the --sup
flag.
mix new my_app --sup
Add the services to be supervised in the application file lib/my_app/application.ex
.
defmodule MyApp.Application do
# See https://hexdocs.pm/elixir/Application.html
# for more information on OTP Applications
@moduledoc false
use Application
def start(_type, _args) do
import Supervisor.Spec, warn: false
# List all child processes to be supervised
children = [
{MyApp, [%{greeting: "Hello"}]},
]
# See https://hexdocs.pm/elixir/Supervisor.html
# for other strategies and supported options
opts = [strategy: :one_for_one, name: MyApp.Supervisor]
Supervisor.start_link(children, opts)
end
end
Start project using iex -S mix
and visit https://localhost:8080.
- Consistent server and client interfaces
- Stream isolation; one process per stream
- Bidirectional streaming; send and receive streamed data
- Server push; to reduce latency
- Automatic flow control; at stream and connection level
- Secure data transport; TLS(SSL) support via ALPN
- Verified against h2spec (143/146)
- Simple request/response interactions; Raxx interface
- HTTP upgrade mechanisms
- HTTP/1.1 pipelining
View progress on the roadmap.
Run h2spec against the example hello_http2
application.
- Start the example app.
cd examples/hello_http2
iex -S mix
- Run h2spec from docker
sudo docker run --net="host" summerwind/h2spec --port 8443 -t -k -S