# `Quiver.Conn`
[🔗](https://github.com/edlontech/quiver/blob/main/lib/quiver/conn.ex#L1)

Behaviour for HTTP connection implementations.

Connections are protocol-specific data structs (HTTP/1, HTTP/2)
that serialize requests and parse responses over a transport.

All response fragments are tagged with a request reference for
multiplexing support. HTTP/1 uses a single ref per request.

# `body`

```elixir
@type body() :: iodata() | nil | {:stream, Enumerable.t()}
```

# `headers`

```elixir
@type headers() :: [{String.t(), String.t()}]
```

# `method`

```elixir
@type method() ::
  :get | :head | :post | :put | :delete | :patch | :options | :trace | :connect
```

# `response_fragment`

```elixir
@type response_fragment() ::
  {:status, reference(), non_neg_integer()}
  | {:headers, reference(), headers()}
  | {:data, reference(), binary()}
  | {:done, reference()}
  | {:error, reference(), term()}
```

# `t`

```elixir
@type t() :: struct()
```

# `cancel`
*optional* 

```elixir
@callback cancel(conn :: t(), ref :: reference()) :: {:ok, t()} | {:error, t(), term()}
```

# `close`

```elixir
@callback close(conn :: t()) :: {:ok, t()}
```

# `connect`

```elixir
@callback connect(uri :: URI.t(), opts :: keyword()) :: {:ok, t()} | {:error, term()}
```

# `max_concurrent_streams`
*optional* 

```elixir
@callback max_concurrent_streams(conn :: t()) :: non_neg_integer()
```

# `open?`

```elixir
@callback open?(conn :: t()) :: boolean()
```

# `open_request`
*optional* 

```elixir
@callback open_request(
  conn :: t(),
  method(),
  path :: String.t(),
  headers(),
  body :: body()
) :: {:ok, t(), reference()} | {:error, t(), term()}
```

# `open_request_count`
*optional* 

```elixir
@callback open_request_count(conn :: t()) :: non_neg_integer()
```

# `request`

```elixir
@callback request(conn :: t(), method(), path :: String.t(), headers(), body :: body()) ::
  {:ok, t(), Quiver.Response.t()} | {:error, t(), term()}
```

# `stream`

```elixir
@callback stream(conn :: t(), message :: term()) ::
  {:ok, t(), [response_fragment()]} | {:error, t(), term()} | :unknown
```

---

*Consult [api-reference.md](api-reference.md) for complete listing*
