/* This code is part of Freenet. It is distributed under the GNU General * Public License, version 2 (or at your option any later version). See * http://www.gnu.org/ for further details of the GPL. */ package freenet.support; import java.io.UnsupportedEncodingException; /** * Encodes strings for use in URIs. Note that this is <b>NOT</b> the same as java.net.URLEncoder, which * encodes strings to application/x-www-urlencoded. This is much closer to what java.net.URI does. We * don't turn spaces into +'s, and we allow through non-ascii characters unless told not to. */ public class URLEncoder { // Moved here from FProxy by amphibian final static String safeURLCharacters = "*-_./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"; public static String getSafeURLCharacters() { return safeURLCharacters; } public static String encode(String URL, String force, boolean ascii) { return encode(URL, force, ascii, ""); } /** * Encode a string for inclusion in a URI. * * @param URL String to encode * @param force List of characters (in the form of a string) which must be encoded as well as the built-in. * @param ascii If true, encode all foreign letters, if false, leave them as is. Set to true if you are * passing to something that needs ASCII (e.g. HTTP headers), set to false if you are using in an HTML page. * @return Encoded version of string */ public static String encode(String URL, String force, boolean ascii, String extraSafeChars) { StringBuilder enc = new StringBuilder(URL.length()); for (int i = 0; i < URL.length(); ++i) { char c = URL.charAt(i); if ((safeURLCharacters.indexOf(c) >= 0 || (!ascii && c >= 128 && Character.isDefined(c) && !Character.isISOControl(c) && !Character.isSpaceChar(c)) || extraSafeChars.indexOf(c) >= 0) && (force == null || force.indexOf(c) < 0)) { enc.append(c); } else { try { for (byte b: String.valueOf(c).getBytes("UTF-8")) { int x = b & 0xFF; if (x < 16) enc.append("%0"); else enc.append('%'); enc.append(Integer.toHexString(x)); } } catch (UnsupportedEncodingException e) { throw new Error("Impossible: JVM doesn't support UTF-8: " + e, e); } } } return enc.toString(); } /** * Encode a string for inclusion in a URI. * * @param URL String to encode * @param ascii If true, encode all foreign letters, if false, leave them as is. Set to true if you are * passing to something that needs ASCII (e.g. HTTP headers), set to false if you are using in an HTML page. * @return Encoded version of string */ public static String encode(String s, boolean ascii) { return encode(s, null, ascii); } }