/* * Encog(tm) Core v3.4 - Java Version * http://www.heatonresearch.com/encog/ * https://github.com/encog/encog-java-core * Copyright 2008-2016 Heaton Research, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * For more information on Heaton Research copyrights, licenses * and trademarks visit: * http://www.heatonresearch.com/copyright */ package org.encog.util.http; import java.io.File; import java.io.IOException; import java.net.URL; /** * URLUtility: A set of useful utilities for processing URL's. */ public final class URLUtility { /** * Beyond this number are special chars. */ public static final int SPECIAL_CHAR_LIMIT = 255; /** * The name of the usual default document. */ public static final String INDEX_FILE = "index.html"; /** * Construct a URL from its basic parts. * * @param base * The base URL. * @param url * The URL that was found on the base URL's page. * @param stripRef * True if the URL's reference should be stripped. * @return The new URL, built upon the base URL. * @throws IOException * Thrown if any IO error occurs. */ public static URL constructURL(final URL base, final String url, final boolean stripRef) throws IOException { URL result = new URL(base, url); String file = result.getFile(); final String protocol = result.getProtocol(); final String host = result.getHost(); final int port = result.getPort(); final String ref = result.getRef(); final StringBuilder sb = new StringBuilder(file); int index = sb.indexOf(" "); while (index != -1) { if (index != -1) { sb.replace(index, index + 1, "%20"); } index = sb.indexOf(" "); } file = sb.toString(); if ((ref != null) && !stripRef) { result = new URL(protocol, host, port, file + "#" + ref); } else { result = new URL(protocol, host, port, file); } return result; } /** * Returns true if the URL contains any invalid characters. * * @param url * The URL to be checked. * @return True if the URL contains invalid characters. */ public static boolean containsInvalidURLCharacters(final String url) { for (int i = 0; i < url.length(); i++) { final char ch = url.charAt(i); if (ch > URLUtility.SPECIAL_CHAR_LIMIT) { return true; } } return false; } /** * Convert a filename for local storage. Also create the directory tree. * * @param base * The local path that forms the base of the downloaded web tree. * @param url * The URL path. * @param mkdir * Should the directory structure be created. * @return The resulting local path to store to. */ public static String convertFilename(final String base, final URL url, final boolean mkdir) { final StringBuilder result = new StringBuilder(base); int index1; int index2; // append the host name StringBuilder path = new StringBuilder(url.getHost().replace('.', '_')); if (url.getFile().length() == 0) { path.append('/'); } else { path.append(url.getFile()); } // add ending slash if needed if (result.charAt(result.length() - 1) != File.separatorChar) { result.append(File.separator); } // see if an ending / is missing from a directory only int lastSlash = path.lastIndexOf("" + File.separatorChar); final int lastDot = path.lastIndexOf("."); if (path.charAt(path.length() - 1) != '/') { if (lastSlash > lastDot) { path.append(File.pathSeparatorChar); path.append(URLUtility.INDEX_FILE); } } // determine actual filename lastSlash = path.lastIndexOf("/"); String filename = ""; if (lastSlash != -1) { filename = path.substring(1 + lastSlash); path = path.replace(1 + lastSlash, path.length(), ""); if (filename.equals("")) { filename = URLUtility.INDEX_FILE; } } // create the directory structure, if needed index1 = 0; do { index2 = path.indexOf("/", index1); if (index2 != -1) { final String dirpart = path.substring(index1, index2); result.append(dirpart); result.append(File.separator); if (mkdir) { final File f = new File(result.toString()); f.mkdir(); } index1 = index2 + 1; } } while (index2 != -1); // attach name result.append(filename.replace('?', '_')); return result.toString(); } /** * Private constructor. */ private URLUtility() { } }