# `HTTPower.Client`
[🔗](https://github.com/mdepolli/httpower/blob/v0.22.0/lib/httpower/client.ex#L1)

HTTPower client with adapter support and advanced features.

This module provides:
- Adapter pattern supporting multiple HTTP clients (Finch, Req, Tesla)
- Test mode request blocking
- Smart retry logic with exponential backoff and jitter
- Clean error handling (never raises exceptions)
- SSL/Proxy configuration support
- Request timeout management
- Request encoding and response decoding via `HTTPower.Codec` (`json:`, `form:`, `raw:`)

The client sits above the adapter layer, providing consistent retry logic,
error handling, and other production features regardless of the underlying
HTTP client.

## Compile-Time Configuration

Default adapter and middleware pipeline settings are cached at compile time
via `Application.compile_env/3` for performance. Changes to `:httpower`
application config require recompilation of this module to take effect.
Runtime options passed per-request always take precedence.

# `delete`

```elixir
@spec delete(
  String.t(),
  keyword()
) :: {:ok, HTTPower.Response.t()} | {:error, HTTPower.Error.t()}
```

Makes an HTTP DELETE request.

# `get`

```elixir
@spec get(
  String.t(),
  keyword()
) :: {:ok, HTTPower.Response.t()} | {:error, HTTPower.Error.t()}
```

Makes an HTTP GET request.

# `head`

```elixir
@spec head(
  String.t(),
  keyword()
) :: {:ok, HTTPower.Response.t()} | {:error, HTTPower.Error.t()}
```

Makes an HTTP HEAD request.

# `options`

```elixir
@spec options(
  String.t(),
  keyword()
) :: {:ok, HTTPower.Response.t()} | {:error, HTTPower.Error.t()}
```

Makes an HTTP OPTIONS request.

# `patch`

```elixir
@spec patch(
  String.t(),
  keyword()
) :: {:ok, HTTPower.Response.t()} | {:error, HTTPower.Error.t()}
```

Makes an HTTP PATCH request.

# `post`

```elixir
@spec post(
  String.t(),
  keyword()
) :: {:ok, HTTPower.Response.t()} | {:error, HTTPower.Error.t()}
```

Makes an HTTP POST request.

# `put`

```elixir
@spec put(
  String.t(),
  keyword()
) :: {:ok, HTTPower.Response.t()} | {:error, HTTPower.Error.t()}
```

Makes an HTTP PUT request.

---

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