System.Web.HttpUtility.ParseQueryString et UrlDecode

La première question que je me pose lorsque je dois developper quelque chose de nouveau est, est-ce que ça existe pas déjà !, je voulais donc parser une url pour extraire les paramètres, je vois la methode System.Web.HttpUtility.ParseQueryString, elle retourne une NameValueCollection.

Je lance un test  :

                [Test]
               
public void ParseQueryString()
                {
                       
var url = "http://www.site.com/index.html?param1=A+B";
                       
var uri = new Uri(url);

                       
var prms = System.Web.HttpUtility.ParseQueryString(uri.Query);

                       
Assert.AreEqual(prms.Keys[0], "param1");
                       
Assert.AreEqual(prms["param1"], "A+B");
                }

Résultat :

failed: 
  String lengths are both 3. Strings differ at index 1.
  Expected: "A B"
  But was:  "A+B"
  ------------^

La méthode se permet d’urldecoder le paramètre (chose qui ne lui ai pas demandé) en plus à la rigueur, ça serait param1=A%20B, mais la c’est imparable comme bug.

Je précise, j’utilise le Framework .Net 3.5 SP1

Je viens juste de perdre quelques heures avant de comprendre le comportement de cette méthode. Pour contourner :

                [Test]
               
public void ParseQueryString()
                {
                       
var url = "http://www.site.com/index.html?param1=A+B";
                       
var uri = new Uri(url);

                       
var prms = from keyvalue in uri.Query.Replace("?", "").Split('&')
                                          
select keyvalue.Split('=');

                       
Assert.AreEqual(prms.First()[0], "param1");
                       
Assert.AreEqual(prms.First()[1], "A+B");
                }

Le resultat est :

1 passed, 0 failed, 0 skipped

3 commentaires:

Da Scritch a dit…

C'est “logique” : le caractère “+” dans les paramètres d'url a toujours représenté un espace, puisqu'il s'agit d'un espace encodé d'un formulaire GET. Si tu veux un vrai “+”, celui-ci est urlencodé avec son paramètre hexa “%2B”.

Alors oui, c'est agaçant, mais des fois, il vaut mieux ré-inventer la roue quand on est pas sûr. Sur mon code, quand il s'agit d'un dispositif de filtrage de sécurité, j'ai une seule fonction qui nettoie les entrées (cookies, requêtes GEt, POST, etc...) qui a été bien étendue au fil du temps selon les découvertes sur les nouvelles injections, etc...

Anonyme a dit…

pourquoi pas:)

Anonyme a dit…

Hello. And Bye.