Use the URI's setData to set query data (#15187)
commit140e73be4edcce459324b76286457c88460f1013
authorKristof Mattei <864376+Kristof-Mattei@users.noreply.github.com>
Fri, 16 Jul 2021 04:53:47 +0000 (15 21:53 -0700)
committerGitHub <noreply@github.com>
Fri, 16 Jul 2021 04:53:47 +0000 (16 12:53 +0800)
tree14bb84aae688705d693cf2bdc49edef14c5c521e
parentd923c03d529bdee5382b979dd37c383c4ba21966
Use the URI's setData to set query data (#15187)

This allows the system to properly encode the '|', instead of passing
the '|' on in the URL, which is not allowed and breaks proxies such as
Authelia.

Then, for the purpose of generalization, I pushed this pattern through
to all places where we join items with a '|'.

This comes with the caveat that when we have individual components which
contain a '|' or any other character that is not allowed per the
HTTP standard, we still like to encode the individual components,
for example in the case of 3 strings, separated by a '|'.
If we don't do this we run into the risk that upon decoding URI finds
'|' in our original strings, which is something we don't want.

For example:
Sender:
````javascript
const arr = ["foo|1", "bar|2"];
const uri = new URI("test.html").setData(arr.join("|"));
````
Then on the receiving window, when it receives the uri and splits it, it
looks like this:
````javascript
const arr = new URI().getData('hashes').split('|');
// arr is now ["foo", "1", "bar", "2"]
````

This is why when we want to send a literal "|" we need to do
`encodeURIComponent` and `decodeURIComponent` manually on each item,
and THEN we join.

For example:
Sender:
````javascript
const arr = ["foo|1", "bar|2"];
const uri = new URI("test.html").setData(arr.map(encodeURIComponent).join("|"));
````

Receiver:
````javascript
const arr = new URI().getData('hashes').split('|').map(decodeURIComponent);
// arr is now ["foo|1", "bar|2"]
````

We don't need to with hashes as they are HEX, so no risk of any weird
characters in there.
src/webui/www/private/scripts/mocha-init.js