2012-11-23 9 views
5

Mam obiekt URL ze ścieżką zawierającą unwise characters (RFC 2396) w moim przypadku jest to "|" (fajka) postać. Teraz muszę bezpiecznie przekonwertować to na URI, ale URL.toURI() zgłasza wyjątek.Jak przekonwertować adres URL naURI, gdy występują nierozsądne znaki?

Czytałem URL documentation ale ta część jest dla mnie kłopotliwe:

Klasa URL nie sam zakodować lub odkodować żadnych składników URL według mechanizmu ucieczki zdefiniowanego w RFC2396. Obowiązkiem użytkownika wywołującego jest kodowanie dowolnych pól, które muszą być poprzedzone przed wywołaniem adresu URL, a także dekodowanie wszelkich zmienionych pól, , które są zwracane z adresu URL. Co więcej, ponieważ URL nie ma wiedzy o konieczności uniknięcia adresu URL, nie rozpoznaje równoważności między zakodowaną lub zdekodowaną formą tego samego adresu URL.

Jak powinienem to zrobić? Jaki jest wzór kodowania tych znaków podczas konwersji? Czy potrzebuję utworzyć zakodowaną kopię mojego obiektu URL?

Odpowiedz

2

OK, mogę wymyślić coś takiego:

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*/); 

Wygląda jak to działa, here is an example. Czy ktoś może potwierdzić, że jest to właściwe rozwiązanie?

Edytuj: initial solution miał pewne problemy, gdy było zapytanie, więc go naprawiłem.

+0

Metoda ta zmienia adres URL, ponieważ koduje części adresu URL, zobacz moje rozwiązanie –

+0

tak masz rację, Zauważyłem, że jakiś czas ego, w ideone.com (patrz pierwszy link) Poprawiłem moje rozwiązanie i dodałem dodatkowe przypadki testowe, które ujawniają ten problem. Sprawdzę twoje rozwiązanie, wygląda lepiej. –

+0

Nawiasem mówiąc, błąd, który przesłałeś na jmeter został naprawiony wczoraj, możesz spróbować nocnej kompilacji –

1

Użyj kodowania URL?

ze swojego przykład masz aktualnie:

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

Zamiast użyłbym:

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

To powinno działać i obsługiwać wszystkie znaki niemądrych na drodze, jak na standard kodowania URL.

+0

To jest OK, ale moim głównym celem była konwersja do URI, więc moje rozwiązanie jest bardziej bezpośrednie, zwłaszcza że nie tworzę adresu URL pochodzącego z kodu zewnętrznego. –

1

HTTPClient 4 ma obiekt dla tego 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;