1111 init /1 ,
1212 size /1 ,
1313 x_header /2 ,
14+ x_headers /1 ,
1415 routing_headers /2 ,
1516 convert_to /3 ,
1617 convert_from /3 ,
@@ -273,6 +274,23 @@ x_header(Key, #content{properties = none} = Content0) ->
273274 Content = rabbit_binary_parser :ensure_content_decoded (Content0 ),
274275 x_header (Key , Content ).
275276
277+ x_headers (# content {properties = # 'P_basic' {headers = undefined }}) ->
278+ #{};
279+ x_headers (# content {properties = # 'P_basic' {headers = Headers }}) ->
280+ L = lists :filtermap (
281+ fun ({Name , Type , Val }) ->
282+ case mc_util :is_x_header (Name ) of
283+ true ->
284+ {true , {Name , from_091 (Type , Val )}};
285+ false ->
286+ false
287+ end
288+ end , Headers ),
289+ maps :from_list (L );
290+ x_headers (# content {properties = none } = Content0 ) ->
291+ Content = rabbit_binary_parser :ensure_content_decoded (Content0 ),
292+ x_headers (Content ).
293+
276294property (Prop , Content ) ->
277295 mc_util :infer_type (mc_compat :get_property (Prop , Content )).
278296
@@ -690,10 +708,23 @@ from_091(binary, V) -> {binary, V};
690708from_091 (timestamp , V ) -> {timestamp , V * 1000 };
691709from_091 (byte , V ) -> {byte , V };
692710from_091 (void , _V ) -> null ;
693- from_091 (array , L ) ->
694- {list , [from_091 (T , V ) || {T , V } <- L ]};
695711from_091 (table , L ) ->
696- {map , [{wrap (symbol , K ), from_091 (T , V )} || {K , T , V } <- L ]}.
712+ {map , [{wrap (symbol , K ), from_091 (T , V )} || {K , T , V } <- L ]};
713+ from_091 (array , []) ->
714+ {list , []};
715+ from_091 (array , L0 = [{T0 , _ } | _ ]) ->
716+ {L = [{T1 , _ } | _ ], {Monomorphic , _ }} =
717+ lists :mapfoldl (fun ({T , V }, {Mono0 , PrevType }) ->
718+ Mono = case Mono0 of
719+ false -> false ;
720+ true -> T =:= PrevType
721+ end ,
722+ {from_091 (T , V ), {Mono , T }}
723+ end , {true , T0 }, L0 ),
724+ case Monomorphic of
725+ true -> {array , T1 , L };
726+ false -> {list , L }
727+ end .
697728
698729map_add (_T , _Key , _Type , undefined , Acc ) ->
699730 Acc ;
@@ -707,7 +738,6 @@ supported_header_value_type(table) ->
707738supported_header_value_type (_ ) ->
708739 true .
709740
710-
711741amqp10_map_get (_K , []) ->
712742 undefined ;
713743amqp10_map_get (K , Tuples ) ->
@@ -857,3 +887,24 @@ amqp10_section_header(Header, Headers) ->
857887
858888amqp_encoded_binary (Section ) ->
859889 iolist_to_binary (amqp10_framing :encode_bin (Section )).
890+
891+ -ifdef (TEST ).
892+ -include_lib (" eunit/include/eunit.hrl" ).
893+
894+ from_091_array_test () ->
895+ {list , []} = from_091 (array , []),
896+ {array , utf8 , [{utf8 , <<" e1" >>}]} = from_091 (array , [{longstr , <<" e1" >>}]),
897+ {array , utf8 , [{utf8 , <<" e1" >>},
898+ {utf8 , <<" e2" >>}]} = from_091 (array , [{longstr , <<" e1" >>},
899+ {longstr , <<" e2" >>}]),
900+ {list , [{utf8 , <<" e1" >>},
901+ {binary , <<" e2" >>}]} = from_091 (array , [{longstr , <<" e1" >>},
902+ {binary , <<" e2" >>}]),
903+ {list , [{utf8 , <<" e1" >>},
904+ {binary , <<" e2" >>},
905+ {utf8 , <<" e3" >>},
906+ {utf8 , <<" e4" >>}]} = from_091 (array , [{longstr , <<" e1" >>},
907+ {binary , <<" e2" >>},
908+ {longstr , <<" e3" >>},
909+ {longstr , <<" e4" >>}]).
910+ -endif .
0 commit comments