README.md

# Ranch Proxy Protocol Socket

![](https://api.travis-ci.org/heroku/ranch_proxy_protocol.svg?branch=master)

This module wraps the `ranch_tcp` module to parse the
[proxy protocol](http://haproxy.1wt.eu/download/1.5/doc/proxy-protocol.txt)
(version 1) before handing the socket on to the `ranch` handler.

It has the same API as the `ranch_tcp` module but with two new
functions; `connect/4` and `proxyname/1`.

The transport is called `ranch_proxy`.

## `connect/4`

`connect/4` allows you to connect with to a remote host, and sending
the proxy protocol header automatically before going on to use the
socket. It's similar to the regular `ranch_tcp:connect/3` but accepts
a third tuple containing proxy protocol information:

``` erlang
-type proxy_opts() :: [{inet_version, ipv4 | ipv6} |
                       {source_address, inet:ip_address() | inet:hostname()} |
                       {source_port, inet:port_number()} |
                       {dest_address, inet:ip_address() | inet:hostname()} |
                       {source_port, inet:port_number()}].
-spec connect(inet:ip_address() | inet:hostname(),
              inet:port_number(), any(), proxy_opts())
	-> {ok, #proxy_socket{}} | {error, atom()}.
```

## `proxyname/1`

`proxyname/1` gives you the proxy protocol information:

``` erlang
-type proxy_protocol_info() :: [{source_address, inet:ip_address()} |
                                {dest_address, inet:ip_address()} |
                                {source_port, inet:port_number()} |
                                {dest_port, inet:port_number()}].
-spec proxyname(proxy_socket()) ->
                       {ok, proxy_protocol_info()} | {error, atom()}.
```

# Run the tests!

Sure why don't you

``` bash
$ rebar3 ct
```

# License

See the `LICENSE` file.