aboutsummaryrefslogtreecommitdiffstats
path: root/src/ranch_tcp.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/ranch_tcp.erl')
-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).