Question

En utilisant Java, je veux dépouiller l'identifiant des fragments et faire une normalisation simple (par exemple, schémas minuscules, hôtes) d'un ensemble diversifié d'URI. Les URI d'entrée et de sortie doivent être équivalents dans un sens général HTTP.

En règle générale, cela devrait être simple. Cependant, pour les uris comme http://blah.org/A_%28Secret%29.xml#blah, qui pourcentage encode (Secret), le comportement de java.util.URI rend la vie difficile.

La méthode de normalisation doit revenir http://blah.org/A_%28Secret%29.xml Depuis les uris http://blah.org/A_%28Secret%29.xml et http://blah.org/A_(Secret).xml ne sont pas équivalents dans l'interprétation [§2.2; RFC3968]

Nous avons donc les deux méthodes de normalisation suivantes:

URI u = new URI("http://blah.org/A_%28Secret%29.xml#blah");
System.out.println(u);
        // prints "http://blah.org/A_%28Secret%29.xml#blah"

String path1 = u.getPath();      //gives "A_(Secret).xml"
String path2 = u.getRawPath();   //gives "A_%28Secret%29.xml"


//NORMALISE METHOD 1
URI norm1 = new URI(u.getScheme().toLowerCase(), u.getUserInfo(), 
                      u.getHost().toLowerCase(), u.getPort(), path1, 
                      u.getQuery(), null);
System.out.println(norm1);
// prints "http://blah.org/A_(Secret).xml"

//NORMALISE METHOD 2
URI norm2 = new URI(u.getScheme().toLowerCase(), u.getUserInfo(),
                      u.getHost().toLowerCase(), u.getPort(), path2, 
                      u.getQuery(), null);
System.out.println(norm2);
// prints "http://blah.org/A_%2528Secret%2529.xml"

Comme nous le voyons, l'URI est analysé et reconstruit sans l'identifiant de fragment.

Cependant, pour la méthode 1, u.getPath() Renvoie un URI non codé, qui change l'URI final.

Pour la méthode 2, u.getRawPath() retourne le chemin d'origine, mais lorsqu'il est passé au URI Constructeur, Java décide d'ajouter le double codage.

Cela ressemble à un piège chinois.

Donc deux questions principales:

  • Pourquoi java.util.URI Vous sentez le besoin de jouer avec l'encodage?
  • Comment cette méthode de normalisation peut-elle être mise en œuvre sans jouer avec le pourcentage de codage d'origine?

(Je préfère ne pas avoir à implémenter les méthodes d'analyse / concaténate de java.util.URI, qui ne sont pas triviaux.)


ÉDITER: Voici quelques informations supplémentaires de URI javadoc.

  • Le constructeur à argument unique nécessite que tous les personnages illégaux de son argument soient cités et préserve tous les octets échappés et d'autres personnages qui sont présents.

  • La constructeurs multi-arguments Citez les caractères illégaux requis par les composants dans lesquels ils apparaissent. Le pourcentage de caractère («%») est toujours cité par ces constructeurs. Tous les autres personnages sont conservés.

  • Le getrawuserinfo, getrawpath, getrawquery, getrawfragment, getrawauthority et getrawschemeSpecificPart méthodes renvoie les valeurs de leurs composants correspondants sous forme brute, sans interpréter aucun octet échappé. Les chaînes renvoyées par ces méthodes peuvent contenir à la fois des octets échappés et d'autres caractères, et ne contiendront aucun caractères illégaux.

  • Le getuserinfo, getpath, getQuery, getFragment, Getauthority et GetchemeSpecificPart Methods décoder tous les octets échappés dans leurs composants correspondants. Les chaînes renvoyées par ces méthodes peuvent contenir à la fois d'autres caractères et des caractères illégaux et ne contiendront aucun octet échappé.

  • La méthode TOSTRING renvoie une chaîne URI avec toutes les citations nécessaires mais qui peuvent contenir d'autres caractères.

  • La méthode TOASCIISTRING renvoie une chaîne URI entièrement citée et codée qui ne contient aucun autre caractères.

Je ne peux donc pas utiliser le constructeur multi-argument sans que le codage URL soit gâché avec le URI classer. HAP!

Pas de solution correcte

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top