aboutsummaryrefslogtreecommitdiffstats
path: root/src/gun_socks.erl
diff options
context:
space:
mode:
authorViktor Söderqvist <[email protected]>2022-10-24 14:09:59 +0200
committerLoïc Hoguin <[email protected]>2022-10-24 14:44:15 +0200
commit1cc3b32b8ef6c187b8be3601319e21c1ba04fa27 (patch)
tree790f27c916f38858d9cca3e18a9f76a6f5ed163c /src/gun_socks.erl
parenta4425a1d7db2d9e35f246aa078c324988ea395f0 (diff)
downloadgun-1cc3b32b8ef6c187b8be3601319e21c1ba04fa27.tar.gz
gun-1cc3b32b8ef6c187b8be3601319e21c1ba04fa27.tar.bz2
gun-1cc3b32b8ef6c187b8be3601319e21c1ba04fa27.zip
Handle send errors
Diffstat (limited to 'src/gun_socks.erl')
-rw-r--r--src/gun_socks.erl30
1 files changed, 20 insertions, 10 deletions
diff --git a/src/gun_socks.erl b/src/gun_socks.erl
index b94bc2c..51f1e0b 100644
--- a/src/gun_socks.erl
+++ b/src/gun_socks.erl
@@ -92,10 +92,14 @@ init(ReplyTo, Socket, Transport, Opts) ->
{username_password, _, _} -> <<2>>;
none -> <<0>>
end || A <- Auth>>,
- Transport:send(Socket, [<<5, (length(Auth))>>, Methods]),
- {ok, connected_no_input, #socks_state{ref=StreamRef, reply_to=ReplyTo,
- socket=Socket, transport=Transport,
- opts=Opts, version=Version, status=auth_method_select}}.
+ case Transport:send(Socket, [<<5, (length(Auth))>>, Methods]) of
+ ok ->
+ {ok, connected_no_input, #socks_state{ref=StreamRef, reply_to=ReplyTo,
+ socket=Socket, transport=Transport,
+ opts=Opts, version=Version, status=auth_method_select}};
+ Error={error, _Reason} ->
+ Error
+ end.
switch_transport(Transport, Socket, State) ->
State#socks_state{socket=Socket, transport=Transport}.
@@ -105,20 +109,26 @@ handle(Data, State, CookieStore, _, EvHandlerState) ->
%% No authentication.
handle(<<5, 0>>, State=#socks_state{version=5, status=auth_method_select}) ->
- send_socks5_connect(State),
- {state, State#socks_state{status=connect}};
+ case send_socks5_connect(State) of
+ ok -> {state, State#socks_state{status=connect}};
+ Error={error, _} -> Error
+ end;
%% Username/password authentication.
handle(<<5, 2>>, State=#socks_state{socket=Socket, transport=Transport, opts=#{auth := AuthMethods},
version=5, status=auth_method_select}) ->
[{username_password, Username, Password}] = [Method || Method <- AuthMethods],
ULen = byte_size(Username),
PLen = byte_size(Password),
- Transport:send(Socket, <<1, ULen, Username/binary, PLen, Password/binary>>),
- {state, State#socks_state{status=auth_username_password}};
+ case Transport:send(Socket, <<1, ULen, Username/binary, PLen, Password/binary>>) of
+ ok -> {state, State#socks_state{status=auth_username_password}};
+ Error={error, _} -> Error
+ end;
%% Username/password authentication successful.
handle(<<1, 0>>, State=#socks_state{version=5, status=auth_username_password}) ->
- send_socks5_connect(State),
- {state, State#socks_state{status=connect}};
+ case send_socks5_connect(State) of
+ ok -> {state, State#socks_state{status=connect}};
+ Error={error, _} -> Error
+ end;
%% Username/password authentication error.
handle(<<1, _>>, #socks_state{version=5, status=auth_username_password}) ->
{error, {socks5, username_password_auth_failure}};