diff options
Diffstat (limited to 'users/sterni/nix/url')
-rw-r--r-- | users/sterni/nix/url/default.nix | 39 | ||||
-rw-r--r-- | users/sterni/nix/url/tests/default.nix | 7 |
2 files changed, 46 insertions, 0 deletions
diff --git a/users/sterni/nix/url/default.nix b/users/sterni/nix/url/default.nix index ce7ed9b83437..37bd0de66ac9 100644 --- a/users/sterni/nix/url/default.nix +++ b/users/sterni/nix/url/default.nix @@ -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 ; } diff --git a/users/sterni/nix/url/tests/default.nix b/users/sterni/nix/url/tests/default.nix index f58cf12a02b2..7cf53cde1555 100644 --- a/users/sterni/nix/url/tests/default.nix +++ b/users/sterni/nix/url/tests/default.nix @@ -16,6 +16,10 @@ let assertEq "encode ${builtins.toJSON left} == ${builtins.toJSON right}" (url.encode args left) right; + checkDecoding = { left, right }: + assertEq "${builtins.toJSON left} == decode ${builtins.toJSON right}" + (url.decode left) right; + unreserved = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.-_~"; encodeExpected = [ @@ -31,6 +35,9 @@ let testEncode = it "checks url.encode" (builtins.map (checkEncoding {}) encodeExpected); + testDecode = it "checks url.decode" + (builtins.map checkDecoding encodeExpected); + testLeaveReserved = it "checks that leaveReserved is like id for valid URLs" (builtins.map (x: checkEncoding { leaveReserved = true; } { left = x; right = x; }) [ "ftp://ftp.is.co.za/rfc/rfc1808.txt" |