# ReqProxy
A [Req] plugin to set Mint proxy parameters according to system environment
variables such as `https_proxy`. This allows Req to behave like most other
high-level HTTP clients, on systems where proxying should be automatically
configured.
Simplified usage is possible when the caller knows which proxy to use, this can
be passed through the `:proxy` request option.
## Usage
To add the `ReqProxy` step to a request, call `attach/1`:
```elixir
Req.new()
|> ReqProxy.attach()
```
### Options
* `:proxy` - Overrides any other proxy environment or connect_options.
Passing an empty string `""` or the atom `:none` disables proxying. Passing
a URL will use it as a proxy. Example: `proxy: "http://proxy.domain:8080"`
### Environment variables
See the [curl manual](https://curl.se/docs/manpage.html#ENVIRONMENT) for a
classic overview of each environment variable. The curl man page leaves some
room for interpretation,
see also Stan Hu's discussion of quirks in "[We need to talk: Can we standardize NO_PROXY?](https://about.gitlab.com/blog/we-need-to-talk-no-proxy/)".
The destination will be matched against several optional environment
variables, in this order:
* If the host matches any term in the comma-separated `no_proxy` variable,
then no proxy will be used. Host patterns are given by any of:
* A **single asterix** `"*"` matches all hosts.
* **Exact host** name or IP match, eg. `no_proxy="a.test"` matches `a.test`.
* **Subdomain** match, eg. `no_proxy=".a.test"` matches `api.a.test`.
* Contained in a **CIDR block**, eg. `no_proxy="127.0.0.0/24"` matches `127.0.0.1`.
* `http_proxy` or `https_proxy` will be used depending on the destination
scheme. Other named schemes will be looked up dynamically, eg. "ftp_proxy".
* `all_proxy` is the ultimate fallback: if no other proxy is found and the
target host is not ruled out for proxying, then the all_proxy value is used.
## Installation
`req_proxy` can be added to a project through `mix.exs`:
```elixir
def deps do
[
{:req_proxy, "~> 0.1.0"}
]
end
```
If you want to use CIDR blocks in the `no_proxy` list, you must also include `:inet_cidr`:
```elixir
def deps do
[
{:req_proxy, "~> 0.1.0"},
{:inet_cidr, "~> 1.0.0"}
]
end
```
The dependency on `:inet_cidr` is soft: if the library is unavailable then a
warning will be logged for every request that could not parse a CIDR block.
## Development
Documentation can be generated with [ExDoc](https://github.com/elixir-lang/ex_doc):
```sh
mix docs
```
and published on [HexDocs](https://hexdocs.pm):
```sh
mix hex.publish
```
The docs will be published at
<https://hexdocs.pm/req_proxy>.
[Req]: https://hexdocs.pm/req/
Run tests with:
```sh
mix test
```