-
Notifications
You must be signed in to change notification settings - Fork 0
/
url.erl
49 lines (34 loc) · 877 Bytes
/
url.erl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
-module(url).
-export([safe/1, encode/1, decode/1]).
safe(C) when $a =< C, C =< $z;
$A =< C, C =< $Z;
$0 =< C, C =< $9 ->
C;
safe(C) ->
%% "$-_.+!*'(),"
case lists:member(C, ".-_~") of
true -> C;
false -> "%" ++ integer_to_hexlist(C)
end.
encode(<<Binary/binary>>) ->
encode(binary_to_list(Binary));
encode(String) ->
one_level_flatten(lists:map(fun safe/1, String)).
decode("%" ++ [N, M | Rest]) ->
[httpd_util:hexlist_to_integer([N, M]) | decode(Rest)];
decode([C | Rest]) ->
[C | decode(Rest)];
decode([]) ->
[].
integer_to_hexlist(C) ->
case httpd_util:integer_to_hexlist(C) of
[X] -> [$0, X];
NN -> NN
end.
one_level_flatten(List) ->
lists:foldr(fun ([Obj | Rest], Acc) -> [Obj | Rest ++ Acc];
([], Acc) -> Acc;
(Obj, Acc) -> [Obj | Acc]
end,
[],
List).