Просмотр исходного кода

fix(ws): take ws_cookie to clientinfo

see: https://github.com/emqx/emqx/issues/3747#issuecomment-702268570
JianBo He 5 лет назад
Родитель
Сommit
2feeb4d91f
3 измененных файлов с 30 добавлено и 3 удалено
  1. 7 1
      src/emqx.appup.src
  2. 11 2
      src/emqx_channel.erl
  3. 12 0
      test/emqx_channel_SUITE.erl

+ 7 - 1
src/emqx.appup.src

@@ -5,8 +5,11 @@
         4 -> % arch_32
             {1000, cuttlefish_bytesize:parse("32MB")}
     end,
-{"4.2.1",
+{"4.2.2",
   [
+    {"4.2.1", [
+      {load_module, emqx_channel, brutal_purge, soft_purge, []}
+    ]},
     {"4.2.0", [
       {load_module, emqx_channel, brutal_purge, soft_purge, []},
       {apply, {application, set_env,
@@ -16,6 +19,9 @@
     ]}
   ],
   [
+    {"4.2.1", [
+      {load_module, emqx_channel, brutal_purge, soft_purge, []}
+    ]},
     {"4.2.0", [
       {load_module, emqx_channel, brutal_purge, soft_purge, []}
     ]}

+ 11 - 2
src/emqx_channel.erl

@@ -183,8 +183,9 @@ init(ConnInfo = #{peername := {PeerHost, _Port},
                      is_bridge    => false,
                      is_superuser => false
                     }, Options),
-    #channel{conninfo   = ConnInfo,
-             clientinfo = ClientInfo,
+    {NClientInfo, NConnInfo} = take_ws_cookie(ClientInfo, ConnInfo),
+    #channel{conninfo   = NConnInfo,
+             clientinfo = NClientInfo,
              topic_aliases = #{inbound => #{},
                                outbound => #{}
                               },
@@ -213,6 +214,14 @@ setting_peercert_infos(Peercert, ClientInfo, Options) ->
                end,
     ClientInfo#{username => Username, dn => DN, cn => CN}.
 
+take_ws_cookie(ClientInfo, ConnInfo) ->
+    case maps:take(ws_cookie, ConnInfo) of
+        {WsCookie, NConnInfo} ->
+            {ClientInfo#{ws_cookie => WsCookie}, NConnInfo};
+        _ ->
+            {ClientInfo, ConnInfo}
+    end.
+
 %%--------------------------------------------------------------------
 %% Handle incoming packet
 %%--------------------------------------------------------------------

+ 12 - 0
test/emqx_channel_SUITE.erl

@@ -687,6 +687,18 @@ t_terminate(_) ->
     ok = emqx_channel:terminate(sock_error, channel(#{conn_state => connected})),
     ok = emqx_channel:terminate({shutdown, kicked}, channel(#{conn_state => connected})).
 
+t_ws_cookie_init(_) ->
+    WsCookie = [{<<"session_id">>, <<"xyz">>}],
+    ConnInfo = #{socktype => ws,
+                 peername => {{127,0,0,1}, 3456},
+                 sockname => {{127,0,0,1}, 1883},
+                 peercert => nossl,
+                 conn_mod => emqx_ws_connection,
+                 ws_cookie => WsCookie
+                },
+    Channel = emqx_channel:init(ConnInfo, [{zone, zone}]),
+    ?assertMatch(#{ws_cookie := WsCookie}, emqx_channel:info(clientinfo, Channel)).
+
 %%--------------------------------------------------------------------
 %% Helper functions
 %%--------------------------------------------------------------------