18
18
19
19
-include (" rabbit.hrl" ).
20
20
21
- -export ([queue_name_to_binary /1 ]).
21
+ -export ([queue_name_to_binary /1 , string_and_binary_tuple_2_to_binary / 1 ]).
22
22
23
23
queue_name_to_binary (# resource {kind = queue } = {resource , VHost , queue , Name }) ->
24
24
VHostBSize = byte_size (VHost ),
@@ -30,3 +30,51 @@ queue_name_to_binary(#resource{kind = queue} = {resource, VHost, queue, Name}) -
30
30
100 , 0 , 5 , " queue" , % % `queue` atom
31
31
109 , NameBSize :32 , Name /binary >>. % % Name binary
32
32
33
+ string_and_binary_tuple_2_to_binary ({StringOrBinary1 , StringOrBinary2 })
34
+ when (is_list (StringOrBinary1 ) orelse is_binary (StringOrBinary1 ))
35
+ andalso (is_list (StringOrBinary2 ) orelse is_binary (StringOrBinary2 )) ->
36
+ Binary1 = string_or_binary_to_binary (StringOrBinary1 ),
37
+ Binary2 = string_or_binary_to_binary (StringOrBinary2 ),
38
+ <<131 , % % Binary format "version"
39
+ 104 , 2 , % % 2-element tuple
40
+ Binary1 /binary , % % first element
41
+ Binary2 /binary >>. % % second element
42
+
43
+ string_or_binary_to_binary (String ) when is_list (String ) ->
44
+ % % length would fail on improper lists
45
+ Len = length (String ),
46
+ case string_type (String ) of
47
+ empty -> <<106 >>;
48
+ short ->
49
+ StringBin = list_to_binary (String ),
50
+ <<107 ,
51
+ Len :16 ,
52
+ StringBin /binary >>;
53
+ long ->
54
+ Bin = lists :foldl (
55
+ fun (El , Acc ) ->
56
+ ElBin = format_integer (El ),
57
+ <<Acc /binary , ElBin /binary >>
58
+ end ,
59
+ <<108 , Len :32 >>,
60
+ String ),
61
+ <<Bin /binary , 106 >>
62
+ end ;
63
+ string_or_binary_to_binary (Binary ) when is_binary (Binary ) ->
64
+ Size = byte_size (Binary ),
65
+ <<109 , Size :32 , Binary /binary >>.
66
+
67
+ string_type ([]) -> empty ;
68
+ string_type (String ) ->
69
+ % % String length fit in 2 bytes
70
+ case length (String ) < 65535 andalso
71
+ % % All characters are ASCII
72
+ lists :all (fun (El ) -> El < 256 end , String ) of
73
+ true -> short ;
74
+ false -> long
75
+ end .
76
+
77
+ format_integer (Integer ) when Integer < 256 ->
78
+ <<97 , Integer :8 >>;
79
+ format_integer (Integer ) ->
80
+ <<98 , Integer :32 >>.
0 commit comments