feat(sterni/nix/url): implement urldecoding
We use builtins.split directly as it should be a bit more efficient as lib.splitStrings. Also its returning of a list for every regex match is useful to update the state while parsing the tokens: * The tokens are obtained by splitting the string at every '%' * Everytime we see a boundary (that is a list in the returned list of builtins.split), we know that the first two chars of the next string are a percent encoded character. One implementation flaw is that it will currently crash if it encounters mal-formed URLs (since int.fromHex chrashes if it encounters any non hex digit characters) and accepts some malformed urlencoding like "foo %A". Change-Id: I90d08d7a71b16b4f4a4879214abd7aeff46c20c8 Reviewed-on: https://cl.tvl.fyi/c/depot/+/2744 Tested-by: BuildkiteCI Reviewed-by: sterni <sternenseemann@systemli.org>
This commit is contained in:
parent
28b2c79c14
commit
a5f2b446aa
2 changed files with 46 additions and 0 deletions
|
|
@ -6,6 +6,7 @@ let
|
|||
char
|
||||
int
|
||||
string
|
||||
flow
|
||||
;
|
||||
|
||||
reserved = c: builtins.elem c [
|
||||
|
|
@ -35,8 +36,46 @@ let
|
|||
else percentEncode c;
|
||||
in lib.concatStrings (builtins.map tr chars);
|
||||
|
||||
decode = s:
|
||||
let
|
||||
tokens = builtins.split "%" s;
|
||||
decodeStep =
|
||||
{ result ? ""
|
||||
, inPercent ? false
|
||||
}: s:
|
||||
flow.cond [
|
||||
[
|
||||
(builtins.isList s)
|
||||
{
|
||||
inherit result;
|
||||
inPercent = true;
|
||||
}
|
||||
]
|
||||
[
|
||||
inPercent
|
||||
{
|
||||
inPercent = false;
|
||||
# first two characters came after an %
|
||||
# the rest is the string until the next %
|
||||
result = result
|
||||
+ char.chr (int.fromHex (string.take 2 s))
|
||||
+ (string.drop 2 s);
|
||||
}
|
||||
]
|
||||
[
|
||||
(!inPercent)
|
||||
{
|
||||
result = result + s;
|
||||
}
|
||||
]
|
||||
];
|
||||
|
||||
in
|
||||
(builtins.foldl' decodeStep {} tokens).result;
|
||||
|
||||
in {
|
||||
inherit
|
||||
encode
|
||||
decode
|
||||
;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue