summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Wragg <dpw@lshift.net>2009-08-24 16:35:56 +0100
committerDavid Wragg <dpw@lshift.net>2009-08-24 16:35:56 +0100
commit4106fd48f30cac0ecd4a89ea55091712d8a700db (patch)
treefda6ce8e09b758b6415d0132734967c6264dadeb
parent472d2883ea1bef31909f5476d4655e2f23c6df36 (diff)
downloadrabbitmq-server-4106fd48f30cac0ecd4a89ea55091712d8a700db.tar.gz
Escape non-printable ASCII characters using a backslash.
Replacing the previous percent encoding scheme. This approach should a more natural fit from a Unixish command line, and preserves UTF-8.
-rw-r--r--src/rabbit_control.erl48
1 files changed, 20 insertions, 28 deletions
diff --git a/src/rabbit_control.erl b/src/rabbit_control.erl
index 37e4d189..cf20520e 100644
--- a/src/rabbit_control.erl
+++ b/src/rabbit_control.erl
@@ -329,22 +329,23 @@ format_info_item(Items, Key) ->
{value, Info = {Key, Value}} = lists:keysearch(Key, 1, Items),
case Info of
{_, #resource{name = Name}} ->
- url_encode(Name);
+ escape(Name);
_ when Key =:= address; Key =:= peer_address andalso is_tuple(Value) ->
inet_parse:ntoa(Value);
_ when is_pid(Value) ->
atom_to_list(node(Value));
_ when is_binary(Value) ->
- url_encode(Value);
+ escape(Value);
_ ->
io_lib:format("~w", [Value])
end.
display_list(L) when is_list(L) ->
lists:foreach(fun (I) when is_binary(I) ->
- io:format("~s~n", [url_encode(I)]);
+ io:format("~s~n", [escape(I)]);
(I) when is_tuple(I) ->
- display_row([url_encode(V) || V <- tuple_to_list(I)])
+ display_row([escape(V)
+ || V <- tuple_to_list(I)])
end,
lists:sort(L)),
ok;
@@ -356,32 +357,23 @@ call(Node, {Mod, Fun, Args}) ->
rpc_call(Node, Mod, Fun, Args) ->
rpc:call(Node, Mod, Fun, Args, ?RPC_TIMEOUT).
-%% url_encode is lifted from ibrowse, modified to preserve some characters
-url_encode(Bin) when binary(Bin) ->
- url_encode_char(lists:reverse(binary_to_list(Bin)), []).
-
-url_encode_char([X | T], Acc) when X >= $a, X =< $z ->
- url_encode_char(T, [X | Acc]);
-url_encode_char([X | T], Acc) when X >= $A, X =< $Z ->
- url_encode_char(T, [X | Acc]);
-url_encode_char([X | T], Acc) when X >= $0, X =< $9 ->
- url_encode_char(T, [X | Acc]);
-url_encode_char([X | T], Acc)
- when X == $-; X == $_; X == $.; X == $~;
- X == $!; X == $*; X == $'; X == $(;
- X == $); X == $;; X == $:; X == $@;
- X == $&; X == $=; X == $+; X == $$;
- X == $,; X == $/; X == $?; X == $%;
- X == $#; X == $[; X == $] ->
- url_encode_char(T, [X | Acc]);
-url_encode_char([X | T], Acc) ->
- url_encode_char(T, [$%, d2h(X bsr 4), d2h(X band 16#0f) | Acc]);
-url_encode_char([], Acc) ->
+%% escape does C-style backslash escaping of non-printable ASCII
+%% characters. We don't escape characters above 127, since they may
+%% form part of UTF-8 strings.
+
+escape(Bin) when binary(Bin) ->
+ escape_char(lists:reverse(binary_to_list(Bin)), []).
+
+escape_char([$\\ | T], Acc) ->
+ escape_char(T, [$\\, $\\ | Acc]);
+escape_char([X | T], Acc) when X > 32, X /= 127 ->
+ escape_char(T, [X | Acc]);
+escape_char([X | T], Acc) ->
+ escape_char(T, [$\\, $0 + (X bsr 6), $0 + (X band 8#070 bsr 3),
+ $0 + (X band 7) | Acc]);
+escape_char([], Acc) ->
Acc.
-d2h(N) when N<10 -> N+$0;
-d2h(N) -> N+$a-10.
-
list_replace(Find, Replace, List) ->
[case X of Find -> Replace; _ -> X end || X <- List].