fix udp_handler
This commit is contained in:
parent
7fba178acf
commit
77df81f8c3
@ -98,13 +98,14 @@ handle_encrypted_datagram(Packet, State = #state{idle_timeout = IdleTimeout, cip
|
|||||||
{ok, PlainPacket} ->
|
{ok, PlainPacket} ->
|
||||||
handle_datagram(PlainPacket, State);
|
handle_datagram(PlainPacket, State);
|
||||||
{error, Reason} ->
|
{error, Reason} ->
|
||||||
logger:debug("UDP relay ignored undecryptable datagram: ~p", [Reason]),
|
logger:error("UDP relay ignored undecryptable datagram: ~p", [Reason]),
|
||||||
{noreply, State, IdleTimeout}
|
{noreply, State, IdleTimeout}
|
||||||
end.
|
end.
|
||||||
|
|
||||||
handle_datagram(Packet, State = #state{idle_timeout = IdleTimeout}) ->
|
handle_datagram(Packet, State = #state{idle_timeout = IdleTimeout}) ->
|
||||||
case relay_server_udp_protocol:decode(Packet) of
|
case relay_server_udp_protocol:decode(Packet) of
|
||||||
{ok, {open, StreamId, Payload}} ->
|
{ok, {open, StreamId, Payload}} ->
|
||||||
|
logger:debug("UDP handler open stream: ~p", [StreamId]),
|
||||||
{noreply, handle_open(StreamId, Payload, State), IdleTimeout};
|
{noreply, handle_open(StreamId, Payload, State), IdleTimeout};
|
||||||
{ok, {data, StreamId, Payload}} ->
|
{ok, {data, StreamId, Payload}} ->
|
||||||
{noreply, handle_data(StreamId, Payload, State), IdleTimeout};
|
{noreply, handle_data(StreamId, Payload, State), IdleTimeout};
|
||||||
@ -118,7 +119,7 @@ handle_datagram(Packet, State = #state{idle_timeout = IdleTimeout}) ->
|
|||||||
{noreply, State, IdleTimeout}
|
{noreply, State, IdleTimeout}
|
||||||
end.
|
end.
|
||||||
|
|
||||||
handle_open(StreamId, Payload, State = #state{streams = Streams}) ->
|
handle_open(StreamId, Payload, State = #state{streams = Streams, users = Users}) ->
|
||||||
case maps:is_key(StreamId, Streams) of
|
case maps:is_key(StreamId, Streams) of
|
||||||
true ->
|
true ->
|
||||||
send_error(StreamId, <<"stream already open">>, State),
|
send_error(StreamId, <<"stream already open">>, State),
|
||||||
@ -126,7 +127,7 @@ handle_open(StreamId, Payload, State = #state{streams = Streams}) ->
|
|||||||
false ->
|
false ->
|
||||||
case relay_server_udp_protocol:decode_open_request(Payload) of
|
case relay_server_udp_protocol:decode_open_request(Payload) of
|
||||||
{ok, Request} ->
|
{ok, Request} ->
|
||||||
case authenticate(Request, State#state.users) of
|
case authenticate(Request, Users) of
|
||||||
ok ->
|
ok ->
|
||||||
open_stream(StreamId, Request, State);
|
open_stream(StreamId, Request, State);
|
||||||
error ->
|
error ->
|
||||||
@ -141,7 +142,7 @@ handle_open(StreamId, Payload, State = #state{streams = Streams}) ->
|
|||||||
end
|
end
|
||||||
end.
|
end.
|
||||||
|
|
||||||
open_stream(StreamId, #{host := Host, port := Port}, State) ->
|
open_stream(StreamId, #{host := Host, port := Port}, State = #state{streams = Streams, sockets = Sockets}) ->
|
||||||
case connect_remote(Host, Port, State#state.connect_timeout) of
|
case connect_remote(Host, Port, State#state.connect_timeout) of
|
||||||
{ok, Socket} ->
|
{ok, Socket} ->
|
||||||
Stream = #stream{
|
Stream = #stream{
|
||||||
@ -151,7 +152,7 @@ open_stream(StreamId, #{host := Host, port := Port}, State) ->
|
|||||||
port = Port
|
port = Port
|
||||||
},
|
},
|
||||||
logger:debug("UDP relay stream ~p opened to ~ts:~p", [StreamId, Host, Port]),
|
logger:debug("UDP relay stream ~p opened to ~ts:~p", [StreamId, Host, Port]),
|
||||||
put_stream(Stream, State);
|
State#state{streams = maps:put(StreamId, Stream, Streams), sockets = maps:put(Socket, StreamId, Sockets)};
|
||||||
{error, Reason} ->
|
{error, Reason} ->
|
||||||
Message = iolist_to_binary(io_lib:format("connect failed: ~p", [Reason])),
|
Message = iolist_to_binary(io_lib:format("connect failed: ~p", [Reason])),
|
||||||
send_error(StreamId, Message, State),
|
send_error(StreamId, Message, State),
|
||||||
@ -223,12 +224,6 @@ send_remote(#stream{socket = Socket}, Payload) ->
|
|||||||
set_active_once(#stream{socket = Socket}) ->
|
set_active_once(#stream{socket = Socket}) ->
|
||||||
inet:setopts(Socket, [{active, once}]).
|
inet:setopts(Socket, [{active, once}]).
|
||||||
|
|
||||||
put_stream(Stream = #stream{id = StreamId, socket = Socket}, State) ->
|
|
||||||
State#state{
|
|
||||||
streams = maps:put(StreamId, Stream, State#state.streams),
|
|
||||||
sockets = maps:put(Socket, StreamId, State#state.sockets)
|
|
||||||
}.
|
|
||||||
|
|
||||||
close_stream(StreamId, State = #state{streams = Streams}) ->
|
close_stream(StreamId, State = #state{streams = Streams}) ->
|
||||||
case maps:get(StreamId, Streams, undefined) of
|
case maps:get(StreamId, Streams, undefined) of
|
||||||
undefined ->
|
undefined ->
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
{udp_server, [
|
{udp_server, [
|
||||||
{enabled, true},
|
{enabled, true},
|
||||||
{listener, 'relay_server/udp'},
|
{listener, 'relay_server/udp'},
|
||||||
{listen_on, 16380},
|
{listen_on, 1443},
|
||||||
{idle_timeout, 30000},
|
{idle_timeout, 30000},
|
||||||
{connect_timeout, 5000},
|
{connect_timeout, 5000},
|
||||||
{max_connections, 1024},
|
{max_connections, 1024},
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user