Curieusement, j'ai l'impression que tu vois le problème à l'envers
pour moi c'est le Serveur qui reçoit qui décode ce tu as envoyé en Delphi en brut
Encore une fois en vérifiant à une serveur TCP IP Brut, on voit la donnée brute sans l'interprétation du receveur
Et que le receveur décode ce qui est URL \ URI encoded est tout à fait normal, c'est un mécanisme automatique, Delphi fait de même lorsqu'il reçoit, ça évite de le faire soit même.
Avec TRESTRequestParameterOption.poDoNotEncode
Method := TRESTRequestMethod.rmGET;
AddParameter('S', 'Salut%60327', TRESTRequestParameterKind.pkGETorPOST, [TRESTRequestParameterOption.poDoNotEncode]); -> [CLIENT] - 2022-12-01 15:53:15: (Peer=127.0.0.1:64313) Message GET /api/rest/function?S=Salut%60327 HTTP/1.1
AddParameter('S', 'Salut+60327', TRESTRequestParameterKind.pkGETorPOST, [TRESTRequestParameterOption.poDoNotEncode]); -> [CLIENT] - 2022-12-01 15:54:27: (Peer=127.0.0.1:64319) Message GET /api/rest/function?S=Salut+60327 HTTP/1.1
AddParameter('S', 'Salut%c3%a160327', TRESTRequestParameterKind.pkGETorPOST, [TRESTRequestParameterOption.poDoNotEncode]); -> [CLIENT] - 2022-12-01 15:55:04: (Peer=127.0.0.1:64323) Message GET /api/rest/function?S=Salut%c3%a160327 HTTP/1.1
Method := TRESTRequestMethod.rmPOST;
1 2 3 4
| AddParameter('S1', '10Toto', TRESTRequestParameterKind.pkGETorPOST, [TRESTRequestParameterOption.poDoNotEncode]);
AddParameter('S2', 'Salut%60327', TRESTRequestParameterKind.pkGETorPOST, [TRESTRequestParameterOption.poDoNotEncode]);
AddParameter('S3', 'Salut+60327', TRESTRequestParameterKind.pkGETorPOST, [TRESTRequestParameterOption.poDoNotEncode]);
AddParameter('S4', 'Salut%c3%a160327', TRESTRequestParameterKind.pkGETorPOST, [TRESTRequestParameterOption.poDoNotEncode]); |
->
1 2 3 4
| [CLIENT] - 2022-12-01 16:20:52: (Peer=127.0.0.1:64487) Message POST /api/rest/function HTTP/1.1
Content-Length: 59
S1=10Toto&S2=Salut%60327&S3=Salut+60327&S4=Salut%c3%a160327 |
Sans TRESTRequestParameterOption.poDoNotEncode
1 2 3 4
| AddParameter('S1', '10Toto', TRESTRequestParameterKind.pkGETorPOST, []);
AddParameter('S2', 'Salut%60327', TRESTRequestParameterKind.pkGETorPOST, []);
AddParameter('S3', 'Salut+60327', TRESTRequestParameterKind.pkGETorPOST, []); // le + est le seul ré-encodé dans les exemples ci-présents
AddParameter('S4', 'Salut%c3%a160327', TRESTRequestParameterKind.pkGETorPOST, []); // le % est différement encodé selon GET ou POST ? WTF ? |
Method := TRESTRequestMethod.rmGET;
[CLIENT] - 2022-12-01 16:01:05: (Peer=127.0.0.1:64359) Message GET /api/rest/function?S1=10Toto&S2=Salut%60327&S3=Salut%2B60327&S4=Salut%c3%a160327 HTTP/1.1
System.Net.URLClient.TURI.URLEncode autorise 'A' .. 'Z', 'a' .. 'z', '0' .. '9', '-', '_', '.', '~'
Mais considère que si l'on a mis dans la chaine %FF c'est que l'on a encodé soit même la chaine donc il conserve cela ! 









Method := TRESTRequestMethod.rmPOST;
1 2 3 4
| [CLIENT] - 2022-12-01 16:16:05: (Peer=127.0.0.1:64465) Message POST /api/rest/function HTTP/1.1
Content-Length: 67
S1=10Toto&S2=Salut%2560327&S3=Salut%2B60327&S4=Salut%25c3%25a160327 |
+ et % ne sont pas dans la liste des caractères autorisés : 'A' .. 'Z', 'a' .. 'z', '0' .. '9', '-', '_', '.', '~' voir REST.Utils.URIEncode qui ne conserve pas les %FF donc qui le ré-encode un coup, ce qui me semble pas plus mal, c'est plus simple !
Perso, le System.Net.URLClient.TURI.URLEncode qui considère les %FF comme déjà encode, je suis trouve cela un peu vicieux si l'on voulait envoyer volontairement des séquence %FF%FF%FF
Oui poDoNotEncode est là pour que l'on puisse le faire mais cela implique si l'on mélange du %FF avec autre chose de devoir refaire l'encodage soit même de la partie "autre chose"
Voir si 10.4 utilise à la place System.NetEncoding.TNetEncoding.URL comme recommandé !
Je suis en 10.0 donc le code peut être différent, si TURI.URLEncode est maintenant déprécié, cela ne me surprend pas, c'est une mauvaise fonction
1 2 3
| Display('System.NetEncoding.TNetEncoding.URL.Encode(Salut%c3%a160327)',System.NetEncoding.TNetEncoding.URL.Encode('Salut%c3%a160327'));
Display('REST.Utils.URIEncode(Salut%c3%a160327)', REST.Utils.URIEncode('Salut%c3%a160327'));
Display('System.Net.URLClient.TURI.URLEncode(Salut%c3%a160327)', System.Net.URLClient.TURI.URLEncode('Salut%c3%a160327')); // tordu et piégeux en D10.0 donc GET foireux pour envoyer %FF%FF%FF sans qu'il considère cela comme déjà encodé |
1 2 3
| [System.NetEncoding.TNetEncoding.URL.Encode(Salut%c3%a160327)] - 2022-12-01 16:35:23: Salut%25c3%25a160327
[REST.Utils.URIEncode(Salut%c3%a160327)] - 2022-12-01 16:35:23: Salut%25c3%25a160327
[System.Net.URLClient.TURI.URLEncode(Salut%c3%a160327)] - 2022-12-01 16:35:43: Salut%c3%a160327 |
Partager