aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLoïc Hoguin <[email protected]>2018-10-10 11:54:50 +0200
committerLoïc Hoguin <[email protected]>2018-10-10 11:55:50 +0200
commit4b9970bcd725972dbd845e07c34a8ef8409ec04c (patch)
treea7d05ae457ed8a99c2c7c615430696203ac15bc6 /src
parent1cc7de15b6f04835faa2f6505669cb7f90c29796 (diff)
downloadranch-4b9970bcd725972dbd845e07c34a8ef8409ec04c.tar.gz
ranch-4b9970bcd725972dbd845e07c34a8ef8409ec04c.tar.bz2
ranch-4b9970bcd725972dbd845e07c34a8ef8409ec04c.zip
Add ranch_tcp:recv_proxy_header/2
This uses the undocumented function gen_tcp:unrecv/2. Tests have been added for both gen_tcp and ssl connections, including sending data in the same first packet, at least for gen_tcp (ssl tests may or may not end up buffering some of the TLS handshake before the recv call, but there's no guarantees).
Diffstat (limited to 'src')
-rw-r--r--src/ranch_tcp.erl23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/ranch_tcp.erl b/src/ranch_tcp.erl
index d5517a5..ba77308 100644
--- a/src/ranch_tcp.erl
+++ b/src/ranch_tcp.erl
@@ -26,6 +26,7 @@
-export([connect/3]).
-export([connect/4]).
-export([recv/3]).
+-export([recv_proxy_header/2]).
-export([send/2]).
-export([sendfile/2]).
-export([sendfile/4]).
@@ -131,6 +132,28 @@ connect(Host, Port, Opts, Timeout) when is_integer(Port) ->
recv(Socket, Length, Timeout) ->
gen_tcp:recv(Socket, Length, Timeout).
+-spec recv_proxy_header(inet:socket(), timeout())
+ -> {ok, any()} | {error, closed | atom()} | {error, protocol_error, atom()}.
+recv_proxy_header(Socket, Timeout) ->
+ case recv(Socket, 0, Timeout) of
+ {ok, Data} ->
+ case ranch_proxy_header:parse(Data) of
+ {ok, ProxyInfo, <<>>} ->
+ {ok, ProxyInfo};
+ {ok, ProxyInfo, Rest} ->
+ case gen_tcp:unrecv(Socket, Rest) of
+ ok ->
+ {ok, ProxyInfo};
+ Error ->
+ Error
+ end;
+ {error, HumanReadable} ->
+ {error, protocol_error, HumanReadable}
+ end;
+ Error ->
+ Error
+ end.
+
-spec send(inet:socket(), iodata()) -> ok | {error, atom()}.
send(Socket, Packet) ->
gen_tcp:send(Socket, Packet).