aboutsummaryrefslogtreecommitdiff
path: root/src/web/ejabberd_http.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/web/ejabberd_http.erl')
-rw-r--r--src/web/ejabberd_http.erl43
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) ->