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

fix(Stomp): content type returned

chengshq 2 лет назад
Родитель
Сommit
fbd27eda6a

+ 11 - 5
apps/emqx_gateway_stomp/src/emqx_stomp_channel.erl

@@ -1052,9 +1052,16 @@ handle_deliver(
                             _ ->
                                 Headers0
                         end,
+                    Headers2 = lists:foldl(
+                        fun({Key, _Val} = KV, Acc1) ->
+                            lists:keystore(Key, 1, Acc1, KV)
+                        end,
+                        Headers1,
+                        maps:get(stomp_headers, Headers, [])
+                    ),
                     Frame = #stomp_frame{
                         command = <<"MESSAGE">>,
-                        headers = Headers1 ++ maps:get(stomp_headers, Headers, []),
+                        headers = Headers2,
                         body = Payload
                     },
                     [Frame | Acc];
@@ -1160,12 +1167,12 @@ do_negotiate_version(Accepts) ->
         lists:reverse(lists:sort(binary:split(Accepts, <<",">>, [global])))
     ).
 
-do_negotiate_version(Ver, []) ->
-    {error, <<"Supported protocol versions < ", Ver/binary>>};
 do_negotiate_version(Ver, [AcceptVer | _]) when Ver >= AcceptVer ->
     {ok, AcceptVer};
 do_negotiate_version(Ver, [_ | T]) ->
-    do_negotiate_version(Ver, T).
+    do_negotiate_version(Ver, T);
+do_negotiate_version(Ver, _) ->
+    {error, <<"Supported protocol versions < ", Ver/binary>>}.
 
 header(Name, Headers) ->
     get_value(Name, Headers).
@@ -1227,7 +1234,6 @@ frame2message(
         [
             <<"destination">>,
             <<"content-length">>,
-            <<"content-type">>,
             <<"transaction">>,
             <<"receipt">>
         ]

+ 9 - 1
apps/emqx_gateway_stomp/test/emqx_stomp_SUITE.erl

@@ -181,11 +181,15 @@ t_subscribe(_) ->
 
         %% 'user-defined' header will be retain
         ok = send_message_frame(Sock, <<"/queue/foo">>, <<"hello">>, [
-            {<<"user-defined">>, <<"emq">>}
+            {<<"user-defined">>, <<"emq">>},
+            {<<"content-type">>, <<"text/html">>}
         ]),
         ?assertMatch({ok, #stomp_frame{command = <<"RECEIPT">>}}, recv_a_frame(Sock)),
 
         {ok, Frame} = recv_a_frame(Sock),
+        ?assertEqual(
+            <<"text/html">>, proplists:get_value(<<"content-type">>, Frame#stomp_frame.headers)
+        ),
 
         ?assertMatch(
             #stomp_frame{
@@ -977,6 +981,10 @@ t_mountpoint(_) ->
         }} = recv_a_frame(Sock),
         ?assertEqual(<<"t/a">>, proplists:get_value(<<"destination">>, Headers)),
 
+        ?assertEqual(
+            <<"text/plain">>, proplists:get_value(<<"content-type">>, Headers)
+        ),
+
         ok = send_disconnect_frame(Sock)
     end,