Fast close the invalid websocket in init/1 function

This commit is contained in:
Feng Lee 2017-11-20 14:15:51 +08:00
parent 14771cdaee
commit db3a54e31a
1 changed files with 27 additions and 16 deletions

View File

@ -91,23 +91,31 @@ clean_acl_cache(CPid, Topic) ->
init([Env, WsPid, Req, ReplyChannel]) -> init([Env, WsPid, Req, ReplyChannel]) ->
process_flag(trap_exit, true), process_flag(trap_exit, true),
true = link(WsPid),
{ok, Peername} = Req:get(peername),
Headers = mochiweb_headers:to_list(
mochiweb_request:get(headers, Req)),
Conn = Req:get(connection), Conn = Req:get(connection),
ProtoState = emqttd_protocol:init(Conn, Peername, send_fun(ReplyChannel), true = link(WsPid),
[{ws_initial_headers, Headers} | Env]), case Req:get(peername) of
IdleTimeout = get_value(client_idle_timeout, Env, 30000), {ok, Peername} ->
EnableStats = get_value(client_enable_stats, Env, false), Headers = mochiweb_headers:to_list(
ForceGcCount = emqttd_gc:conn_max_gc_count(), mochiweb_request:get(headers, Req)),
{ok, #wsclient_state{connection = Conn, ProtoState = emqttd_protocol:init(Conn, Peername, send_fun(ReplyChannel),
ws_pid = WsPid, [{ws_initial_headers, Headers} | Env]),
peername = Peername, IdleTimeout = get_value(client_idle_timeout, Env, 30000),
proto_state = ProtoState, EnableStats = get_value(client_enable_stats, Env, false),
enable_stats = EnableStats, ForceGcCount = emqttd_gc:conn_max_gc_count(),
force_gc_count = ForceGcCount}, {ok, #wsclient_state{connection = Conn,
IdleTimeout, {backoff, 2000, 2000, 20000}, ?MODULE}. ws_pid = WsPid,
peername = Peername,
proto_state = ProtoState,
enable_stats = EnableStats,
force_gc_count = ForceGcCount},
IdleTimeout, {backoff, 2000, 2000, 20000}, ?MODULE};
{error, enotconn} -> Conn:fast_close(),
exit(WsPid, normal),
exit(normal);
{error, Reason} -> Conn:fast_close(),
exit(WsPid, normal),
exit({shutdown, Reason})
end.
prioritise_call(Msg, _From, _Len, _State) -> prioritise_call(Msg, _From, _Len, _State) ->
case Msg of info -> 10; stats -> 10; state -> 10; _ -> 5 end. case Msg of info -> 10; stats -> 10; state -> 10; _ -> 5 end.
@ -203,6 +211,9 @@ handle_info({shutdown, conflict, {ClientId, NewPid}}, State) ->
?WSLOG(warning, "clientid '~s' conflict with ~p", [ClientId, NewPid], State), ?WSLOG(warning, "clientid '~s' conflict with ~p", [ClientId, NewPid], State),
shutdown(conflict, State); shutdown(conflict, State);
handle_info({shutdown, Reason}, State) ->
shutdown(Reason, State);
handle_info({keepalive, start, Interval}, State = #wsclient_state{connection = Conn}) -> handle_info({keepalive, start, Interval}, State = #wsclient_state{connection = Conn}) ->
?WSLOG(debug, "Keepalive at the interval of ~p", [Interval], State), ?WSLOG(debug, "Keepalive at the interval of ~p", [Interval], State),
case emqttd_keepalive:start(stat_fun(Conn), Interval, {keepalive, check}) of case emqttd_keepalive:start(stat_fun(Conn), Interval, {keepalive, check}) of