diff options
Diffstat (limited to 'src/web/ejabberd_http.erl')
-rw-r--r-- | src/web/ejabberd_http.erl | 43 |
1 files changed, 42 insertions, 1 deletions
diff --git a/src/web/ejabberd_http.erl b/src/web/ejabberd_http.erl index 7b6c65645..550f3e0e4 100644 --- a/src/web/ejabberd_http.erl +++ b/src/web/ejabberd_http.erl @@ -13,7 +13,8 @@ %% External exports -export([start/2, start_link/2, - receive_headers/1]). + receive_headers/1, + url_encode/1]). -include("ejabberd.hrl"). -include("jlib.hrl"). @@ -652,6 +653,46 @@ parse_urlencoded(undefined, _, _, _) -> []. +url_encode([H|T]) -> + if + H >= $a, $z >= H -> + [H|url_encode(T)]; + H >= $A, $Z >= H -> + [H|url_encode(T)]; + H >= $0, $9 >= H -> + [H|url_encode(T)]; + H == $_; H == $.; H == $-; H == $/; H == $: -> % FIXME: more.. + [H|url_encode(T)]; + true -> + case integer_to_hex(H) of + [X, Y] -> + [$%, X, Y | url_encode(T)]; + [X] -> + [$%, $0, X | url_encode(T)] + end + end; + +url_encode([]) -> + []. + +integer_to_hex(I) -> + case catch erlang:integer_to_list(I, 16) of + {'EXIT', _} -> + old_integer_to_hex(I); + Int -> + Int + end. + + +old_integer_to_hex(I) when I<10 -> + integer_to_list(I); +old_integer_to_hex(I) when I<16 -> + [I-10+$A]; +old_integer_to_hex(I) when I>=16 -> + N = trunc(I/16), + old_integer_to_hex(N) ++ old_integer_to_hex(I rem 16). + + % The following code is mostly taken from yaws_ssl.erl parse_request(State, Data) -> |