Returns a normalized URL. @param string input URL @return path
(final String string)
| 256 | * @return path |
| 257 | */ |
| 258 | private static String normalize(final String string) { |
| 259 | final String input = toAscii(string); |
| 260 | int i = input.indexOf("://") + 3; |
| 261 | if(i == 2) return input; |
| 262 | |
| 263 | final String scheme = input.substring(0, i); |
| 264 | String path = input.substring(i), query = "", anchor = ""; |
| 265 | i = path.indexOf('#'); |
| 266 | if(i != -1) { |
| 267 | anchor = path.substring(i); |
| 268 | path = path.substring(0, i); |
| 269 | } |
| 270 | i = path.indexOf('?'); |
| 271 | if(i != -1) { |
| 272 | query = path.substring(i); |
| 273 | path = path.substring(0, i); |
| 274 | } |
| 275 | |
| 276 | final StringList segments = new StringList(Strings.split(path, '/')); |
| 277 | for(int s = 1; s < segments.size(); s++) { |
| 278 | final String segment = segments.get(s); |
| 279 | if(segment.equals(".")) { |
| 280 | segments.remove(s--); |
| 281 | } else if(segment.equals("..") && s > 1) { |
| 282 | segments.remove(s--); |
| 283 | segments.remove(s--); |
| 284 | } |
| 285 | } |
| 286 | return scheme + String.join("/", segments.finish()) + query + anchor; |
| 287 | } |
| 288 | |
| 289 | /** |
| 290 | * Converts the host of a URL to ASCII (Punycode) if it contains non-ASCII |