@@ -41,14 +41,14 @@ connect(Host, Port, Opts, Timeout) when is_list(Host), is_integer(Port),
4141 ProxyHost = proplists :get_value (socks5_host , Opts ),
4242 ProxyPort = proplists :get_value (socks5_port , Opts ),
4343 Transport = proplists :get_value (socks5_transport , Opts ),
44-
44+
4545 % % filter connection options
4646 AcceptedOpts = [linger , nodelay , send_timeout ,
4747 send_timeout_close , raw , inet6 ],
4848 BaseOpts = [binary , {active , false }, {packet , 0 }, {keepalive , true },
4949 {nodelay , true }],
5050 ConnectOpts = hackney_util :filter_options (Opts , AcceptedOpts , BaseOpts ),
51-
51+
5252 % % connect to the socks 5 proxy
5353 case gen_tcp :connect (ProxyHost , ProxyPort , ConnectOpts , Timeout ) of
5454 {ok , Socket } ->
@@ -186,8 +186,9 @@ do_connection(Socket, Host, Port, Options) ->
186186 case addr (Host , Port , Resolve ) of
187187 Addr when is_binary (Addr ) ->
188188 ok = gen_tcp :send (Socket , << 5 , 1 , 0 , Addr /binary >>),
189- case gen_tcp :recv (Socket , 10 , ? TIMEOUT ) of
190- {ok , << 5 , 0 , 0 , BoundAddr /binary >>} ->
189+ case gen_tcp :recv (Socket , 4 , ? TIMEOUT ) of
190+ {ok , << 5 , 0 , 0 , AType >>} ->
191+ BoundAddr = recv_addr_port (AType , gen_tcp , Socket ),
191192 check_connection (BoundAddr );
192193 {ok , _ } ->
193194 {error , badarg };
@@ -225,6 +226,19 @@ addr(Host, Port, Resolve) ->
225226 end
226227 end .
227228
229+ recv_addr_port (1 = AType , Transport , Socket ) -> % IPv4
230+ {ok , Data } = Transport :recv (Socket , 6 , ? TIMEOUT ),
231+ <<AType , Data >>;
232+ recv_addr_port (4 = AType , Transport , Socket ) -> % IPv6
233+ {ok , Data } = Transport :recv (Socket , 18 , ? TIMEOUT ),
234+ <<AType , Data >>;
235+ recv_addr_port (3 = AType , Transport , Socket ) -> % Domain
236+ {ok , <<DLen /integer >>} = Transport :recv (Socket , 1 , ? TIMEOUT ),
237+ {ok , AddrPort } = Transport :recv (Socket , DLen + 2 , ? TIMEOUT ),
238+ <<AType , DLen , AddrPort /binary >>;
239+ recv_addr_port (_ , _ , _ ) ->
240+ error .
241+
228242check_connection (<< 3 , _DomainLen :8 , _Domain /binary >>) ->
229243 ok ;
230244check_connection (<< 1 , _Addr :32 , _Port :16 >>) ->
0 commit comments