diff options
author | Loïc Hoguin <[email protected]> | 2018-10-23 12:10:53 +0200 |
---|---|---|
committer | Loïc Hoguin <[email protected]> | 2018-10-23 12:10:53 +0200 |
commit | d2720842a63dc7bc6ac01d9e2866bfa78cb39aa5 (patch) | |
tree | be72af8e3dc7f40eff2302b739541feb61ce69d2 /src/ranch.erl | |
parent | 8652000c0c40feee8f664b58ccb5cdfa60441a5f (diff) | |
download | ranch-d2720842a63dc7bc6ac01d9e2866bfa78cb39aa5.tar.gz ranch-d2720842a63dc7bc6ac01d9e2866bfa78cb39aa5.tar.bz2 ranch-d2720842a63dc7bc6ac01d9e2866bfa78cb39aa5.zip |
Add ranch:recv_proxy_header/2
This is the function that should be called regardless of
TCP or TLS being used. The proper usage for this function is:
{ok, ProxyInfo} = ranch:recv_proxy_header(Ref, Timeout),
{ok, Socket} = ranch:handshake(Ref),
...
Ranch takes care of everything else under the hood. Transports
now need to have a Transport:recv_proxy_header/2 function. For
ranch_ssl the function gets the port from the sslsocket() record
and then calls ranch_tcp:recv_proxy_header/2 with it.
This means that two undocumented features are currently used for
this, but the interface is really nice so that's a sacrifice
worth doing. Also worth noting is that OTP 22 should have an
alternative for gen_tcp:unrecv/2 so the only real issue is about
the sslsocket() record at the moment.
Diffstat (limited to 'src/ranch.erl')
-rw-r--r-- | src/ranch.erl | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/src/ranch.erl b/src/ranch.erl index 2664fd8..894f78b 100644 --- a/src/ranch.erl +++ b/src/ranch.erl @@ -25,6 +25,7 @@ -export([accept_ack/1]). -export([handshake/1]). -export([handshake/2]). +-export([recv_proxy_header/2]). -export([remove_connection/1]). -export([get_status/1]). -export([get_addr/1]). @@ -256,6 +257,16 @@ handshake(Ref, Opts) -> end end. +-spec recv_proxy_header(ref(), timeout()) + -> {ok, ranch_proxy_header:proxy_info()} + | {error, closed | atom()} + | {error, protocol_error, atom()}. +recv_proxy_header(Ref, Timeout) -> + receive HandshakeState={handshake, Ref, Transport, CSocket, _} -> + self() ! HandshakeState, + Transport:recv_proxy_header(CSocket, Timeout) + end. + -spec remove_connection(ref()) -> ok. remove_connection(Ref) -> ConnsSup = ranch_server:get_connections_sup(Ref), |