diff --git a/calexium_lib/web/CXM_multihost_http_server.anubis b/calexium_lib/web/CXM_multihost_http_server.anubis index e8c114e..4665c2f 100644 --- a/calexium_lib/web/CXM_multihost_http_server.anubis +++ b/calexium_lib/web/CXM_multihost_http_server.anubis @@ -1007,8 +1007,8 @@ define Word8 Word8 x1, Word8 x2 ) = - with n1 = if x1 +=< '9' then (x1 - '0') else (x1 - 'A' + 10), - n2 = if x2 +=< '9' then (x2 - '0') else (x2 - 'A' + 10), + with n1 = if x1 +=< '9' then (x1 - '0') else if x1 +=< 'F' then (x1 - 'A' + 10) else (x1 - 'a' + 10), + n2 = if x2 +=< '9' then (x2 - '0') else if x2 +=< 'F' then (x2 - 'A' + 10) else (x2 - 'a' + 10), (n1 << 4) + n2. diff --git a/calexium_lib/web/CXM_urllib.anubis b/calexium_lib/web/CXM_urllib.anubis new file mode 100644 index 0000000..d403331 --- /dev/null +++ b/calexium_lib/web/CXM_urllib.anubis @@ -0,0 +1,154 @@ +/* + * Created by PyramIDE. + * User: ricard + * Date: 21/11/2009 + * Time: 01:27 + * + */ + +read tools/basis.anubis +read system/lists.anubis +read system/string.anubis + +public define String + _url_encode_char + ( + Word8 c + )= + "%" +to_upper(to_hexa(c)). + + +public define List(Word8) + _url_quote + ( + List(Word8) string, + List(Word8) safe, + Bool plus, + List(Word8) so_far + ) = + if string is + { + [] then reverse(so_far), + [h . t] then + if (h = '-' | h = '_' | h = '.' | contains(safe, h) + | (h >=+ '0' & h +=< '9') + | (h >=+ 'a' & h +=< 'z') + | (h >=+ 'A' & h +=< 'Z') ) then + _url_quote(t, safe, plus, [h . so_far]) + else if (h = ' ' & plus) then + _url_quote(t, safe, plus, ['+' . so_far]) + else + _url_quote(t, safe, plus, reverse(explode(_url_encode_char(h))) + so_far) + }. + + +/** + * Replace special characters in string using the "%xx" escape. Letters, digits, and the characters "_.-" are never quoted. + * The optional safe parameter specifies additional characters that should not be quoted -- its default value is '/'. + */ +public define String + url_quote + ( + String string, + String safe + ) = + implode(_url_quote(explode(string), explode(safe), false, [])). + +/** + * Replace special characters in string using the "%xx" escape. Letters, digits, and the characters "_.-" are never quoted. + * The optional safe parameter specifies additional characters that should not be quoted -- its default value is '/'. + */ +public define String + url_quote + ( + String string, + ) = + url_quote(string, "/"). + +/** + * Like quote(), but also replaces spaces by plus signs, as required for quoting HTML form values. + * Plus signs in the original string are escaped unless they are included in safe. It also does not have safe default to '/'. + */ +public define String + url_quote_plus + ( + String string, + String safe + ) = + implode(_url_quote(explode(string), explode(safe), true, [])). + +/** + * Like quote(), but also replaces spaces by plus signs, as required for quoting HTML form values. + * Plus signs in the original string are escaped unless they are included in safe. It also does not have safe default to '/'. + */ +public define String + url_quote_plus + ( + String string, + ) = + url_quote_plus(string, ""). + + +//----------- + +define Word8 + _url_decode_char + ( + Word8 x1, + Word8 x2 + ) = + with n1 = if x1 +=< '9' then (x1 - '0') else if x1 +=< 'F' then (x1 - 'A' + 10) else (x1 - 'a' + 10), + n2 = if x2 +=< '9' then (x2 - '0') else if x1 +=< 'F' then (x1 - 'A' + 10) else (x2 - 'a' + 10), + (n1 << 4) + n2. + + +public define List(Word8) + _url_unquote + ( + List(Word8) string, + Bool plus, + List(Word8) so_far + ) = + if string is + { + [] then reverse(so_far), + [h . t] then + if h = '%' then + if t is + { + [] then reverse([h . so_far]), + [h1 . t1] then + if t1 is + { + [] then reverse([h1, h . so_far]), + [h2 . t2] then + _url_unquote(t2, plus, [_url_decode_char(h1, h2) . so_far]) + } + } + else if (h = '+' & plus) then + _url_unquote(t, plus, [' ' . so_far]) + else + _url_unquote(t, plus, [h . so_far]) + }. + +/** + * Replace "%xx" escapes by their single-character equivalent. + * Example: unquote("/%7Econnolly/") yields "/~connolly/". + */ +public define String + url_unquote + ( + String string, + ) = + implode(_url_unquote(explode(string), false, [])). + +/** + * Like unquote(), but also replaces plus signs by spaces, as required for unquoting HTML form values. + */ +public define String + url_unquote_plus + ( + String string, + ) = + implode(_url_unquote(explode(string), true, [])). + -- libgit2 0.21.4