2012-11-23 12 views
5

Ho un oggetto URL con percorso contenente unwise characters (RFC 2396) nel mio caso è "|" (pipe) personaggio. Ora ho bisogno di convertirlo in modo sicuro in URI, ma URL.toURI() genera un'eccezione.Come convertire URL inURI quando ci sono caratteri imprudenti?

Ho letto URL documentation ma questa parte è per me fonte di confusione:

La classe URL per sé non codificare o decodificare qualsiasi componenti URL secondo il meccanismo fuga definito in RFC2396. È la responsabilità dello del chiamante per codificare qualsiasi campo, che deve essere escape prima di chiamare l'URL, e anche per decodificare eventuali campi di escape, restituiti dall'URL. Inoltre, poiché l'URL non ha conoscenza di escape dell'URL , non riconosce l'equivalenza tra lo codificato o il modulo decodificato dello stesso URL.

Quindi come dovrei farlo? Qual è lo schema qui per codificare questi personaggi durante la conversione? Devo creare una copia codificata del mio oggetto URL?

risposta

2

OK, ho venire con qualcosa di simile:

URI uri = new URI(url.getProtocol(), 
        null /*userInfo*/, 
        url.getHost(), 
        url.getPort(), 
        (url.getPath()==null)?null:URLDecoder.decode(url.getPath(), "UTF-8"), 
        (url.getQuery()==null)?null:URLDecoder.decode(url.getQuery(), "UTF-8"), 
        null /*fragment*/); 

sembra che funziona, here is an example. Qualcuno può confermare che questa è la soluzione giusta?

Edit: initial solution avuto alcuni problemi quando ci fu una query in modo che ho riparato.

+0

Questo metodo altera URL, che codifica url parti del URL, vedere la mia soluzione –

+0

sì hai ragione, Ho notato che un po 'di tempo in ego, in ideone.com (vedi il primo link) ho corretto la mia soluzione e ho aggiunto casi di test aggiuntivi che rivelano questo problema. Controllerò la tua soluzione, sembra migliore. –

+0

A proposito, il bug che hai inviato su jmeter è stato corretto ieri, puoi provare la build notturna –

1

Utilizzare la codifica URL?

dal vostro esempio, attualmente si dispone:

URL url = new URL("http", "google.com", 8080, "/crapy|path with-unwise_characters.jpg"); 

Invece, vorrei utilizzare:

String path = "/crapy|path with-unwise_characters.jpg" 
URL url = new URL("http", "google.com", 8080, URLEncoder.encode(path, "UTF-8")); 

questo dovrebbe funzionare e gestire tutti i caratteri poco sagge nel percorso come per la codifica URL standard.

+0

questa è una soluzione OK, ma il mio obiettivo principale era la conversione in URI, quindi la mia soluzione è più diretta, soprattutto perché non creo l'URL che proviene dal codice di terze parti. –

1

HTTPClient 4 ha un oggetto che org.apache.http.client.utils.URIBuilder:

  URIBuilder builder = 
      new URIBuilder() 
     .setScheme(url.getProtocol()) 
     .setHost(url.getHost()) 
     .setPort(url.getPort()) 
     .setUserInfo(url.getUserInfo()) 
     .setPath(url.getPath()) 
     .setQuery(url.getQuery()); 
    URI uri = builder.build(); 
    return uri; 
Problemi correlati